J'ai essayé le code suivant mais je n'ai pas trouvé la différence entre np.dot et np.multiply avec np.sum
Voici np.dot code
logprobs = np.dot(Y, (np.log(A2)).T) + np.dot((1.0-Y),(np.log(1 - A2)).T)
print(logprobs.shape)
print(logprobs)
cost = (-1/m) * logprobs
print(cost.shape)
print(type(cost))
print(cost)
Sa sortie est
(1, 1)
[[-2.07917628]]
(1, 1)
<class 'numpy.ndarray'>
[[ 0.693058761039 ]]
Voici le code pour np.multiply avec np.sum
logprobs = np.sum(np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2)))
print(logprobs.shape)
print(logprobs)
cost = - logprobs / m
print(cost.shape)
print(type(cost))
print(cost)
Sa sortie est
()
-2.07917628312
()
<class 'numpy.float64'>
0.693058761039
Je suis incapable de comprendre la différence de type et de forme alors que la valeur du résultat est la même dans les deux cas
Même en cas de compression de l'ancien code la valeur du coût devient la même que plus tard, mais le type reste le même
cost = np.squeeze(cost)
print(type(cost))
print(cost)
la sortie est
<class 'numpy.ndarray'>
0.6930587610394646
np.dot
est le produit scalaire de deux matrices.
|A B| . |E F| = |A*E+B*G A*F+B*H|
|C D| |G H| |C*E+D*G C*F+D*H|
Alors que np.multiply
fait une multiplication élément par élément de deux matrices.
|A B| ⊙ |E F| = |A*E B*F|
|C D| |G H| |C*G D*H|
Lorsqu'il est utilisé avec np.sum
, le résultat égal est simplement une coïncidence.
>>> np.dot([[1,2], [3,4]], [[1,2], [2,3]])
array([[ 5, 8],
[11, 18]])
>>> np.multiply([[1,2], [3,4]], [[1,2], [2,3]])
array([[ 1, 4],
[ 6, 12]])
>>> np.sum(np.dot([[1,2], [3,4]], [[1,2], [2,3]]))
42
>>> np.sum(np.multiply([[1,2], [3,4]], [[1,2], [2,3]]))
23
Si Y
et A2
sont des tableaux (1, N), alors np.dot(Y,A.T)
produira un résultat (1,1). Il fait une multiplication matricielle d'un (1, N) avec un (N, 1). Les N's
sont additionnés, laissant le (1,1).
Avec multiply
, le résultat est (1, N). Faites la somme de toutes les valeurs et le résultat est un scalaire.
Si Y
et A2
avaient la forme (N,) (le même nombre d'éléments, mais 1d), la fonction np.dot(Y,A2)
(no .T
) produira également un scalaire. De la documentation np.dot
:
Pour les matrices 2D, cela équivaut à la multiplication matricielle et pour les matrices 1D au produit interne des vecteurs
Retourne le produit scalaire de a et b. Si a et b sont tous les deux des scalaires ou des deux tableaux 1-D, un scalaire est renvoyé. sinon, un tableau est retourné.
squeeze
réduit toutes les dimensions de la taille 1, mais renvoie toujours un tableau. Dans numpy
, un tableau peut avoir un nombre quelconque de dimensions (de 0 à 32). Donc, un tableau 0d est possible. Comparez la forme de np.array(3)
, np.array([3])
et np.array([[3]])
.
In this example it just not a coincidence. Lets take an example we have two (1,3) and (1,3) matrices.
// Lets code
import numpy as np
x1=np.array([1, 2, 3]) // first array
x2=np.array([3, 4, 3]) // second array
//Then
X_Res=np.sum(np.multiply(x1,x2))
// will result 20 as it will be calculated as - (1*3)+(2*4)+(3*3) , i.e element wise
// multiplication followed by sum.
Y_Res=np.dot(x1,x2.T)
// in order to get (1,1) matrix) from a dot of (1,3) matrix and //(1,3) matrix we need to //transpose second one.
//Hence|1 2 3| * |3|
// |4| = |1*3+2*4+3*3| = |20|
// |3|
// will result 20 as it will be (1*3)+(2*4)+(3*3) , i.e. dot product of two matrices
print X_Res //20
print Y_Res //20