Implementación de Python de la función de costo en regresión logística: por qué la multiplicación de puntos en una expresión pero la multiplicación por elementos en otra


18

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:

ingrese la descripción de la imagen aquí

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)

ingrese la descripción de la imagen aquí

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.


2
¿Estás cuestionando las fórmulas matemáticas o la traducción entre las fórmulas matemáticas y el código? Es decir, desea saber por qué la función de costo se expresa como una suma y el cálculo del gradiente se expresa como una multiplicación de matriz; o quiere entender por qué el se convierte al mismo tiempo X ( A - Y ) T se convierte ? yyoIniciar sesión(unyo)Y * np.log(A)X(UN-Y)Tnp.dot(X, dz.T)
Neil Slater

2
Gracias Neil Perdón por la ambigüedad. El segundo. Entiendo las fórmulas matemáticas. Simplemente no puedo entender la intuición de la multiplicación de puntos en uno y la multiplicación por elementos en el otro
GhostRider

Respuestas:


12

En este caso, las dos fórmulas matemáticas le muestran el tipo correcto de multiplicación:

  • yyoIniciar sesión(unyo)yun

  • UNsiC=UNsiCyok=jUNyojsijknp.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)))o cost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))while Yy Atener forma (m,1)y debería dar el mismo resultado. NB el np.sumsolo 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.


1
Neil: Sí, tienes razón. Andrew Ngs nuevo curso de DL. Y también tu respuesta tiene mucho sentido. Gracias por el aporte.
GhostRider

"Por lo tanto, cada elemento de y solo interactúa con su elemento correspondiente en a, que es básicamente la definición de elemento inteligente", una explicación increíblemente lúcida.
GhostRider

2

¿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)es np.dot(X, Y). La versión de puntos sería más eficiente y fácil de entender, en general.

Ynp.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.


Gracias. Eso no es exactamente lo que estoy preguntando. Vea el código alternativo que tengo para la función de costo (último bit de código). Esto es incorrecto, pero estoy tratando de entender por qué es incorrecto.
GhostRider

2
En el caso de la OP np.sum(a * y)no va a ser igual a np.dot(a, y)porque ay yson vectores de columna de forma (m,1), por lo que la dotfunció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.
Neil Slater

0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.