#python #matlab #numpy
#python #matlab #numpy
Вопрос:
Я новичок в numpy, и меня уже немного тошнит от его синтаксиса.
Что-то, что можно было бы написать подобным образом в Octave / matlab
1/(2*m) * (X * theta - y)' * (X*theta -y)
Становится ли это в numpy
np.true_divide(((X.dot(theta)-y).transpose()).dot((X.dot(theta)-y)),2*m)
Мне намного сложнее писать и отлаживать. Есть ли лучший способ написать матричные операции, подобные приведенным выше, чтобы упростить жизнь?
Комментарии:
1. В отличие от Java, вы можете перегружать операторы в Python. Не знаком с numpy в частности, но, возможно, вы можете расширить тип данных, с которым вы работаете, и внедрить в него методы перегрузки операторов.
2. Не связанный с проблемами синтаксиса, вероятно, стоит вычислять
X*theta - y
отдельно и использовать значение дважды вместо его повторного вычисления.3. @user2357112 да. хороший момент.
4. FWIW: В отличие от matlab,
numpy
это просто пакет на языке программирования общего пользования. Поэтому неудивительно, что его синтаксис не такой «математический», как у matlab…5. @Santa: numpy уже перегружает операторы, чтобы разрешить поэлементные операции, но не предоставляет оператора для умножения матриц, в основном потому, что операторов недостаточно для обхода. (
*
должно означать либо поэлементное, либо матричное умножение, и для массивов numpy они решили сделать так, чтобы это означало первое.)
Ответ №1:
Вы можете внести некоторые упрощения. При использовании from __future__ import division
в начале вашей программы все деления автоматически будут «истинными», поэтому вам не нужно будет использовать true_divide
. (В Python 3 вам даже не нужно этого делать, поскольку истинное деление автоматически устанавливается по умолчанию.) Кроме того, вы можете использовать .T
вместо .transpose()
. Затем ваш код становится
1/(2*m) * ((X.dot(theta) - y).T).dot((X.dot(theta) - y))
что немного лучше.
В Python 3.5 добавляется новый оператор умножения матриц @
в основном именно по этой причине. Это еще не выпущено, но когда это будет сделано (и когда numpy будет обновлен, чтобы использовать его), ваш код станет очень похож на версию Octave:
1/(2*m) * (X@theta - y).T @ (X@theta - y)
Ответ №2:
Вы могли бы попробовать использовать np.matrix
вместо np.ndarray
для двумерных массивов. Он перегружает *
оператор так, что это означает умножение матрицы, поэтому вы можете избавиться от всех .dot
s. Вот документы.
Ответ №3:
Есть способ получше, но вам придется обратиться к документации numpy, чтобы найти его.
На этой странице перечислено множество эквивалентностей между matlab и numpy с более простым синтаксисом. Например, a.transpose()
может быть записан как a.T
.
Вы также можете посмотреть отдельную документацию для этих функций, например, для, true_divide
в которой объясняется, что метод Python 3 /
работает для выполнения того же самого.