私は次のコードを試しましたが、np.dotとnp.multiply with np.sumの違いを見つけられませんでした
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)
その出力は
(1, 1)
[[-2.07917628]]
(1, 1)
<class 'numpy.ndarray'>
[[ 0.693058761039 ]]
np.multiply with 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)
その出力は
()
-2.07917628312
()
<class 'numpy.float64'>
0.693058761039
結果の値は両方のケースで同じですが、タイプと形状の違いを理解できません
前のコードを絞る場合でもコスト値は後で同じになりますが、タイプは同じままです
cost = np.squeeze(cost)
print(type(cost))
print(cost)
出力は
<class 'numpy.ndarray'>
0.6930587610394646
np.dot
は、2つのマトリックスの ドット積 です。
|A B| . |E F| = |A*E+B*G A*F+B*H|
|C D| |G H| |C*E+D*G C*F+D*H|
一方、np.multiply
は、2つの行列の 要素ごとの乗算 を実行します。
|A B| ⊙ |E F| = |A*E B*F|
|C D| |G H| |C*G D*H|
np.sum
と共に使用すると、結果が等しいことは単なる偶然です。
>>> 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
Y
とA2
が(1、N)配列の場合、np.dot(Y,A.T)
は(1,1)の結果を生成します。 (1、N)と(N、1)の行列乗算を行っています。 N's
が合計され、(1,1)が残ります。
multiply
の場合、結果は(1、N)です。すべての値を合計すると、結果はスカラーになります。
Y
とA2
が(N、)形(同じ数の要素、ただし1d)の場合、np.dot(Y,A2)
(.T
なし)もスカラーを生成します。 np.dot
ドキュメントから:
2次元配列の場合は行列の乗算に相当し、1次元配列の場合はベクトルの内積に相当します
Aとbの内積を返します。 aとbが両方ともスカラーまたは両方が1次元配列の場合、スカラーが返されます。それ以外の場合、配列が返されます。
squeeze
はすべてのサイズ1の次元を削減しますが、配列を返します。 numpy
では、配列は任意の数の次元(0〜32)を持つことができます。したがって、0d配列が可能です。 np.array(3)
、np.array([3])
、および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