web-dev-qa-db-fra.com

Python Numpy | Différence entre np.dot et np.multiply avec np.sum

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
13
Asad Shakeel

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
29
Anuj Gautam

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]]).

3
hpaulj
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
0
Ashish S