当你试图调用两个行向量的点积时,我试图理解numpy是如何工作的。
我有这段代码:
X = np.array([[1,2,3]])
THETA = np.array([[1,2,3]])
print X.dot(THETA)
这给了我错误:
ValueError: shapes (1,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
我认为你可以把两行向量的点积得到:
x1*theta1 + x2*theta2 + x3*theta3
这也将转移到两个列向量的点积。
奇怪的是,我必须采用第二个矩阵的转置才能实际使用点积:
print X.dot(THETA.T)
array([[14]])
然而,我并不认为这实际上会起作用,为什么它会起作用而不是仅仅进行行点行操作。任何人都可以帮助我理解发生了什么吗?在很久以前我忘记了线性代数中的一些规则吗?
答案 0 :(得分:1)
dot
是矩阵乘法,而不是点积。您所看到的只是矩阵乘法的正常规则的结果。如果你想要一个矢量点积,最简单的方法是使用1D向量,没有多余的第二维:
X = np.array([1, 2, 3])
THETA = np.array([1, 2, 3])
print X.dot(THETA)
dot
- 两个1D数组采用点积并产生标量结果。
如果你想使用行和列向量,那么按照矩阵乘法的标准规则,你需要将1乘N的数组(行向量)乘以N×1数组(列向量) )得到一个1比1的结果,NumPy会给你一个1比1的数组而不是标量。
答案 1 :(得分:0)
您看到的对齐错误是因为您试图将1D向量表示为2D数组。
In [1]: import numpy as np
In [2]: X = np.array([1,2,3])
In [3]: THETA = np.array([1,2,3])
In [4]: print X.dot(THETA)
14
In [5]: print X.dot(THETA.T)
14
和
x1*theta1 + x2*theta2 + x3*theta3 =
1*1 + 2*2 + 3*3 =
14