Реализация функции стоимости в Python в логистической регрессии: почему точечное умножение в одном выражении, а поэлементное умножение в другом

18

У меня есть очень простой вопрос, который относится к 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)))

Я полностью понимаю, что это подробно не объясняется, но я предполагаю, что вопрос настолько прост, что любой, даже имеющий базовый опыт логистической регрессии, поймет мою проблему.

Призрачный гонщик
источник
2
Вы ставите под сомнение математические формулы или перевод математических формул и кода? Т.е. вы хотите знать, почему функция стоимости выражается как сумма, а расчет градиента - как умножение матрицы; или вы хотите понять, почему становится, а становится ? Yяжурнал(aя)Y * np.log(A)Икс(A-Y)Tnp.dot(X, dz.T)
Нил Слэйтер
2
Спасибо, Нил. Извините за двусмысленность. Секунда. Я понимаю математические формулы. Я просто не могу разобраться с интуицией умножения точек в одном и умножения элементов в другом
GhostRider

Ответы:

12

В этом случае две математические формулы показывают правильный тип умножения:

  • Yяжурнал(aя)Ya

  • AВСзнак равноAВСяКзнак равноΣJAяJВJК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)поэтому курс не использует его.

Нил Слэйтер
источник
1
Нил - Да, ты прав. Эндрю Нгс новый курс DL. А также ваш ответ имеет смысл. Спасибо за вклад.
GhostRider
«Таким образом, каждый элемент y взаимодействует только со своим соответствующим элементом в a, который в основном является определением поэлементно», - невероятно ясное объяснение.
GhostRider
2

Вы спрашиваете, в чем разница между точечным произведением двух векторов и суммированием их поэлементного произведения? Они одинаковые. np.sum(X * Y)есть np.dot(X, Y). Точечная версия будет более эффективной и простой для понимания, как правило.

Ynp.dot

Поэтому я предполагаю, что ответ заключается в том, что это разные операции, выполняющие разные задачи, и эти ситуации разные, и основное отличие заключается в том, что они имеют дело с векторами по сравнению с матрицами.

Шон Оуэн
источник
Благодарю. Это не совсем то, что я спрашиваю. Смотрите альтернативный код, который у меня есть для функции стоимости (последний бит кода). Это неправильно, но я пытаюсь понять, почему это неправильно.
GhostRider
2
В случае с ФП в np.sum(a * y)не собирается быть таким же , как np.dot(a, y)потому , что aи yв колонке векторов формы (m,1), поэтому dotфункция вызовет ошибку. Я почти уверен, что это все из coursera.org/learn/neural-networks-deep-learning (курс, на который я только что посмотрел), потому что нотация и код - точное совпадение.
Нил Слэйтер
0

Что касается «В случае 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) матрица, то есть скаляр.

Гордон Хатчисон
источник