Tengo una pregunta muy básica que se relaciona con Python, numpy y multiplicación de matrices en el escenario de regresión logística.
Primero, déjame disculparme por no usar la notación matemática.
Estoy confundido sobre el uso de la multiplicación de puntos de matriz versus la pultiplicación de elementos sabios. La función de costo viene dada por:
Y en Python he escrito esto como
cost = -1/m * np.sum(Y * np.log(A) + (1-Y) * (np.log(1-A)))
Pero, por ejemplo, esta expresión (la primera, la derivada de J con respecto a w)
es
dw = 1/m * np.dot(X, dz.T)
No entiendo por qué es correcto usar la multiplicación de puntos en lo anterior, pero use la multiplicación por elementos en la función de costo, es decir, por qué no:
cost = -1/m * np.sum(np.dot(Y,np.log(A)) + np.dot(1-Y, np.log(1-A)))
Entiendo completamente que esto no se explica detalladamente, pero supongo que la pregunta es tan simple que cualquiera con una experiencia de regresión logística básica comprenderá mi problema.
fuente
Y * np.log(A)
np.dot(X, dz.T)
Respuestas:
En este caso, las dos fórmulas matemáticas le muestran el tipo correcto de multiplicación:
np.dot
En parte, su confusión proviene de la vectorización que se ha aplicado a las ecuaciones en los materiales del curso, que esperan escenarios más complejos. De hecho, podría usar
cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))
ocost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))
whileY
yA
tener forma(m,1)
y debería dar el mismo resultado. NB elnp.sum
solo está aplanando un solo valor en eso, por lo que podría soltarlo y en su lugar tenerlo[0,0]
al final. Sin embargo, esto no se generaliza a otras formas de salida,(m,n_outputs)
por lo que el curso no lo usa.fuente
¿Está preguntando cuál es la diferencia entre un producto de dos vectores y sumando su producto por elementos? Ellos son iguales.
np.sum(X * Y)
esnp.dot(X, Y)
. La versión de puntos sería más eficiente y fácil de entender, en general.np.dot
Entonces, supongo que la respuesta es que son operaciones diferentes que hacen cosas diferentes, y estas situaciones son diferentes, y la principal diferencia es tratar con vectores versus matrices.
fuente
np.sum(a * y)
no va a ser igual anp.dot(a, y)
porquea
yy
son vectores de columna de forma(m,1)
, por lo que ladot
función generará un error. Estoy bastante seguro de que todo esto es de coursera.org/learn/neural-networks-deep-learning (un curso que acabo de ver recientemente), porque la notación y el código coinciden exactamente.Con respecto a "En el caso del OP, np.sum (a * y) no va a ser lo mismo que np.dot (a, y) porque a e y son vectores de columnas en forma (m, 1), por lo que la función de punto será generar un error "...
(No tengo suficientes felicitaciones para comentar usando el botón de comentarios, pero pensé que agregaría ...)
Si los vectores son vectores de columna y tienen forma (1, m), un patrón común es que el segundo operador para la función de punto se pospone con un operador ".T" para transponerlo a la forma (m, 1) y luego el punto el producto funciona como a (1, m). (m, 1). p.ej
np.dot (np.log (1-A), (1-Y) .T)
El valor común para m permite aplicar el producto escalar (multiplicación matricial).
Del mismo modo, para los vectores de columna, se vería la transposición aplicada al primer número, por ejemplo, np.dot (wT, X) para poner la dimensión que es> 1 en el 'medio'.
El patrón para obtener un escalar de np.dot es conseguir que las formas de los dos vectores tengan la dimensión '1' en el 'exterior' y la dimensión común> 1 en el 'interior':
(1, X). (X, 1) o np.dot (V1, V2) Donde V1 es forma (1, X) y V2 es forma (X, 1)
SO el resultado es una matriz (1,1), es decir, un escalar.
fuente