У меня есть очень простой вопрос, который относится к Python, numpy и умножению матриц в настройках логистической регрессии.
Во-первых, позвольте мне извиниться за то, что не использовал математическую запись
Я запутался в использовании умножения матричных точек и поэлементного умножения. Функция стоимости определяется как:
И в Python я написал это как
cost = -1/m * np.sum(Y * np.log(A) + (1-Y) * (np.log(1-A)))
Но, например, это выражение (первое - производная от J по w)
является
dw = 1/m * np.dot(X, dz.T)
Я не понимаю, почему это правильно использовать умножение точек в приведенном выше, но использовать поэлементное умножение в функции стоимости, то есть почему бы и нет:
cost = -1/m * np.sum(np.dot(Y,np.log(A)) + np.dot(1-Y, np.log(1-A)))
Я полностью понимаю, что это подробно не объясняется, но я предполагаю, что вопрос настолько прост, что любой, даже имеющий базовый опыт логистической регрессии, поймет мою проблему.
источник
Y * np.log(A)
np.dot(X, dz.T)
Ответы:
В этом случае две математические формулы показывают правильный тип умножения:
np.dot
Частично ваша путаница проистекает из векторизации , примененной к уравнениям в материалах курса, которые ожидают более сложных сценариев. Вы могли бы на самом деле использования
cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))
или вcost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))
то время ,Y
иA
имеют форму ,(m,1)
и это должно дать тот же результат. Обратите внимание, чтоnp.sum
это просто выравнивает одно значение, так что вы можете сбросить его и вместо этого получить[0,0]
в конце. Однако это не обобщает другие выходные формы,(m,n_outputs)
поэтому курс не использует его.источник
Вы спрашиваете, в чем разница между точечным произведением двух векторов и суммированием их поэлементного произведения? Они одинаковые.
np.sum(X * Y)
естьnp.dot(X, Y)
. Точечная версия будет более эффективной и простой для понимания, как правило.np.dot
Поэтому я предполагаю, что ответ заключается в том, что это разные операции, выполняющие разные задачи, и эти ситуации разные, и основное отличие заключается в том, что они имеют дело с векторами по сравнению с матрицами.
источник
np.sum(a * y)
не собирается быть таким же , какnp.dot(a, y)
потому , чтоa
иy
в колонке векторов формы(m,1)
, поэтомуdot
функция вызовет ошибку. Я почти уверен, что это все из coursera.org/learn/neural-networks-deep-learning (курс, на который я только что посмотрел), потому что нотация и код - точное совпадение.Что касается «В случае OP, np.sum (a * y) не будет таким же, как np.dot (a, y), потому что a и y являются векторами столбцов (m, 1), поэтому функция точки будет поднять ошибку. "...
(У меня недостаточно голосов, чтобы комментировать, используя кнопку комментария, но я решил добавить ..)
Если векторы являются векторами столбцов и имеют форму (1, m), общий шаблон заключается в том, что второй оператор для функции точки добавляется после оператора «.T» для преобразования его в форму (m, 1), а затем точка Продукт работает как (1, м). (м, 1). например
np.dot (np.log (1-A), (1-Y) .T)
Общее значение для m позволяет применить скалярное произведение (умножение матрицы).
Аналогично для векторов столбцов можно увидеть, что транспонирование применено к первому числу, например, np.dot (wT, X), чтобы поместить размер, который> 1, в «середину».
Шаблон для получения скаляра из np.dot состоит в том, чтобы получить формы двух векторов, имеющие измерение «1» на «внешнем» и общее измерение> 1 на «внутреннем»:
(1, X). (X, 1) или np.dot (V1, V2) Где V1 - это форма (1, X), а V2 - это форма (X, 1)
Так что результат - (1,1) матрица, то есть скаляр.
источник