Implementazione Python della funzione di costo nella regressione logistica: perché la moltiplicazione dei punti in un'espressione ma la moltiplicazione degli elementi in un'altra


18

Ho una domanda di base che riguarda Python, intorpidimento e moltiplicazione delle matrici nel contesto della regressione logistica.

Prima di tutto, vorrei scusarmi per non aver usato la notazione matematica.

Sono confuso sull'uso della moltiplicazione dei punti matrice rispetto alla moltiplicazione saggia degli elementi. La funzione di costo è data da:

inserisci qui la descrizione dell'immagine

E in pitone ho scritto questo come

    cost = -1/m * np.sum(Y * np.log(A) + (1-Y) * (np.log(1-A)))

Ma per esempio questa espressione (la prima - la derivata di J rispetto a w)

inserisci qui la descrizione dell'immagine

è

   dw = 1/m * np.dot(X, dz.T)

Non capisco perché sia ​​corretto utilizzare la moltiplicazione dei punti in quanto sopra, ma utilizzare la moltiplicazione saggia dell'elemento nella funzione di costo, ovvero perché no:

   cost = -1/m * np.sum(np.dot(Y,np.log(A)) + np.dot(1-Y, np.log(1-A)))

Capisco perfettamente che questo non è spiegato in modo elaborato, ma suppongo che la domanda sia così semplice che chiunque abbia anche un'esperienza di regressione logistica di base capirà il mio problema.


2
Stai mettendo in discussione le formule matematiche o la traduzione tra le formule matematiche e il codice? Cioè vuoi sapere perché la funzione di costo è espressa come somma e il calcolo del gradiente è espresso come una moltiplicazione di matrici; o vuoi capire perché diventa mentre diventa ? yiolog(un'io)Y * np.log(A)X(UN-Y)Tnp.dot(X, dz.T)
Neil Slater,

2
Grazie Neil. Scusa per l'ambiguità. Il secondo. Capisco le formule matematiche. Non riesco proprio a capire meglio l'intuizione per la moltiplicazione dei punti in una e la saggia moltiplicazione nell'altra
GhostRider

Risposte:


12

In questo caso, le due formule matematiche mostrano il tipo corretto di moltiplicazione:

  • yio e nella funzione di costo sono valori scalari. La composizione dei valori scalari in una data somma su ciascun esempio non cambia questo e in questa somma non si combinano mai i valori di un esempio con un altro. Quindi ogni elemento di interagisce solo con il suo elemento corrispondente in , che è fondamentalmente la definizione di elemento-saggio.log(un'io)yun'

  • I termini nel calcolo del gradiente sono matrici e se vedi due matrici e moltiplicate usando la notazione come , puoi scriverlo come una somma più complessa: . È questa somma interiore tra più termini che sta eseguendo.UNBC=UNBCioK=ΣjUNiojBjKnp.dot

In parte la tua confusione deriva dalla vettorializzazione che è stata applicata alle equazioni nei materiali del corso, che sono in attesa di scenari più complessi. Potresti infatti usare 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 Ye Aavere forma (m,1)e dovrebbe dare lo stesso risultato. NB il valore np.sumsta semplicemente appiattendo un singolo valore, quindi potresti lasciarlo cadere e invece avere [0,0]alla fine. Tuttavia, questo non si generalizza ad altre forme di output, (m,n_outputs)quindi il corso non lo utilizza.


1
Neil - Sì, hai ragione. Andrew Ngs nuovo corso DL. E anche la tua risposta ha perfettamente senso. Grazie per l'input.
GhostRider,

"Quindi ogni elemento di y interagisce solo con il suo elemento di corrispondenza in a, che è fondamentalmente la definizione di elemento-saggio" - spiegazione incredibilmente lucida.
GhostRider,

2

Stai chiedendo, qual è la differenza tra un prodotto punto di due vettori e sommando il loro prodotto elementally? Loro sono la stessa cosa. np.sum(X * Y)lo è np.dot(X, Y). La versione dot sarebbe più efficiente e di facile comprensione, in generale.

Ynp.dot

Quindi immagino che la risposta sia che sono operazioni diverse che fanno cose diverse, e che queste situazioni sono diverse, e la differenza principale riguarda i vettori rispetto alle matrici.


Grazie. Non è proprio quello che sto chiedendo. Vedi il codice alternativo che ho per la funzione di costo (ultimo bit di codice). Questo non è corretto, ma sto cercando di capire perché non è corretto.
GhostRider,

2
Nel caso del PO np.sum(a * y)non sarà lo stesso di np.dot(a, y)perché ae yhanno la forma di vettori di colonna (m,1), quindi la dotfunzione genererà un errore. Sono abbastanza sicuro che tutto questo provenga da coursera.org/learn/neural-networks-deep-learning (un corso che ho appena visto di recente), perché la notazione e il codice corrispondono esattamente.
Neil Slater,

0

Per quanto riguarda "Nel caso del PO np.sum (a * y) non sarà uguale a np.dot (a, y) perché a e y sono forma vettori di colonna (m, 1), quindi la funzione punto sarà solleva un errore. "...

(Non ho abbastanza complimenti per commentare usando il pulsante comment, ma ho pensato di aggiungere ..)

Se i vettori sono vettori di colonna e hanno forma (1, m), un modello comune è che il secondo operatore per la funzione punto è postfisso con un operatore ".T" per trasporlo in forma (m, 1) e quindi il punto prodotto funziona come (1, m). (m, 1). per esempio

np.dot (np.log (1-A), (1-Y) .T)

Il valore comune per m consente di applicare il prodotto punto (moltiplicazione matrice).

Analogamente per i vettori di colonna si vedrebbe la trasposizione applicata al primo numero, ad esempio np.dot (wT, X) per mettere la dimensione che è> 1 nel 'mezzo'.

Lo schema per ottenere uno scalare da np.dot è di ottenere che le forme dei due vettori abbiano la dimensione '1' sull'esterno e la dimensione comune> 1 sull''interno ':

(1, X). (X, 1) o np.dot (V1, V2) Dove V1 è forma (1, X) e V2 è forma (X, 1)

Quindi il risultato è una matrice (1,1), cioè uno scalare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.