скорость умножения векторной фигуры? - PullRequest
0 голосов
/ 06 июня 2018

Я новичок в numpy и обнаружил такое странное (как для меня) поведение.Я реализую функцию стоимости логистической регрессии, здесь у меня есть 2 вектора столбцов с одинаковыми измерениями и одинаковыми типами (dfloat).y содержит множество нулей и единиц, а a содержит числа с плавающей точкой в ​​диапазоне (-1, 1).В какой-то момент я должен получить точечный продукт, чтобы я переставил один и умножил их:

   x = y.T @ a

Но когда я использую

   x = y @ a.T

, иногда производительность снижается примерно в 3 раза, а результаты одинаковыПочему это так?Разве операции не одинаковы?Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Это совершенно разные вещи.Рассмотрим

(a.T @ b).size
(a @ b.T).size

, если оба a и b имеют размер n, результат первого равен 1, а результат второго - n^2.Причина в стандартном скалярном умножении - ячейка i, j является результатом точечного произведения строки i и столбца j произведения.В вашем случае:

  1. Первый - это строка, умноженная на столбец.Так что здесь просто скалярное произведение на векторы - 1 измерение.
  2. Второй - столбец, умноженный на строку.Умножение по-прежнему является строкой * столбец, поэтому вы умножаете строку первого вектора (столбец, то есть одну ячейку) на первый столбец второго (строка, все еще одна ячейка) - это дает ячейку результата (1,1).Вы можете повторить то же самое с первой ячейкой столбца по всей строке, которая является вторым вектором - n results, cell (1,1) ... (1, n).Промойте и повторите n раз (размер столбца), и вы получите матрицу гораздо большего размера.

Итог - второе выражение должно выполнять больше арифметических операций (потенциально гораздо больше, в зависимости от размеров).

0 голосов
/ 06 июня 2018

Производительность снижается, и вы получите совершенно другой ответ!

Для векторного умножения (в отличие от умножения чисел) a @ b != b @ a.В вашем случае (с учетом векторов столбцов) a.T @ b - это число , а a @ b.T - это полноценная матрица !Итак, если ваши векторы имеют форму (1, y), последняя операция приведет к (y, y) матрице, которая может быть довольно большой.Конечно, это займет гораздо больше времени для вычисления такой матрицы (иначе говоря, сложения большого числа чисел и получения целого числа чисел), чем для добавления набора чисел и для получения одного единственного числа .

Так работает матричное (или векторное) умножение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...