Eu tenho uma pergunta muito básica que se relaciona com Python, numpy e multiplicação de matrizes no cenário de regressão logística.
Primeiro, peço desculpas por não usar a notação matemática.
Estou confuso sobre o uso da multiplicação de pontos na matriz versus a multiplicação por elementos. A função de custo é dada por:
E em python eu escrevi isso como
cost = -1/m * np.sum(Y * np.log(A) + (1-Y) * (np.log(1-A)))
Mas, por exemplo, esta expressão (a primeira - a derivada de J em relação a w)
é
dw = 1/m * np.dot(X, dz.T)
Não entendo por que é correto usar a multiplicação de pontos acima, mas use a multiplicação por elementos na função cost, ou seja, por que não:
cost = -1/m * np.sum(np.dot(Y,np.log(A)) + np.dot(1-Y, np.log(1-A)))
Entendo perfeitamente que isso não é explicado de forma elaborada, mas acho que a pergunta é tão simples que qualquer pessoa com experiência básica em regressão logística entenderá meu problema.
fonte
Y * np.log(A)
np.dot(X, dz.T)
Respostas:
Nesse caso, as duas fórmulas matemáticas mostram o tipo correto de multiplicação:
np.dot
Em parte, sua confusão decorre da vetorização aplicada às equações nos materiais do curso, que estão ansiosos por cenários mais complexos. Na verdade, você pode usar
cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))
oucost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))
enquantoY
eA
tem forma(m,1)
e deve dar o mesmo resultado. NB:np.sum
está apenas achatando um único valor, então você pode descartá-lo e, em vez disso, ter[0,0]
no final. No entanto, isso não generaliza para outras formas de saída,(m,n_outputs)
portanto, o curso não o utiliza.fonte
Você está perguntando, qual é a diferença entre um produto escalar de dois vetores e a soma do produto elementar? Eles são os mesmos.
np.sum(X * Y)
énp.dot(X, Y)
. A versão do ponto seria mais eficiente e fácil de entender, geralmente.np.dot
Então, acho que a resposta é que são operações diferentes, fazendo coisas diferentes, e essas situações são diferentes, e a principal diferença é lidar com vetores versus matrizes.
fonte
np.sum(a * y)
não será o mesmo quenp.dot(a, y)
porquea
ey
são os vetores das colunas(m,1)
, portanto adot
função gerará um erro. Tenho certeza de que tudo isso é do coursera.org/learn/neural-networks-deep-learning (um curso que acabei de ver recentemente), porque a notação e o código são uma correspondência exata.Com relação a "No caso do OP, np.sum (a * y) não será o mesmo que np.dot (a, y) porque a e y são de vetores de colunas (m, 1); portanto, a função de ponto será gerar um erro. "...
(Não tenho elogios suficientes para comentar usando o botão de comentário, mas pensei em adicionar ..)
Se os vetores são vetores de coluna e têm forma (1, m), um padrão comum é que o segundo operador para a função ponto seja pós-fixado com um operador ".T" para transpor para forma (m, 1) e depois o ponto produto funciona como um (1, m). (m, 1). por exemplo
np.dot (np.log (1-A), (1-Y) .T)
O valor comum para m permite que o produto escalar (multiplicação de matrizes) seja aplicado.
Da mesma forma, para vetores de coluna, veríamos a transposição aplicada ao primeiro número, por exemplo, np.dot (wT, X) para colocar a dimensão que é> 1 no 'meio'.
O padrão para obter um escalar no np.dot é fazer com que as duas formas de vetores tenham a dimensão '1' no lado de fora e a dimensão comum> 1 no lado de dentro:
(1, X). (X, 1) ou np.dot (V1, V2) Onde V1 é a forma (1, X) e V2 é a forma (X, 1)
SO, o resultado é uma matriz (1,1), ou seja, um escalar.
fonte