在Python中计算两个numpy行数组(向量)的点积给出了一个形状向量
问题描述:
我试图了解numpy在尝试调用两个行向量的点积时是如何工作的。在Python中计算两个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]])
但是,我没想到这会实际工作,以及为什么它将工作,而不是只做点行操作。任何人都可以帮助我理解发生了什么?线性代数中的某些规则是否早已忘记?
答
dot
对于2D输入是矩阵乘法,而不是点乘积。你所看到的只是矩阵乘法正常规则的结果。如果你想要一个向量的点积,最简单的方法是使用一维向量,没有多余的第二个维度:
X = np.array([1, 2, 3])
THETA = np.array([1, 2, 3])
print X.dot(THETA)
dot
-ting两个一维数组需要一个点积和产生一个标量的结果。
如果您想要使用行列向量,那么通过矩阵乘法的标准规则,您需要将N乘1的数组(一个行向量)乘以一个N乘1的数组(一列向量)得到1乘1的结果,NumPy会给你一个1乘1的数组而不是标量。
答
您看到的对齐错误是因为您试图将一维矢量表示为二维数组。
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
你为什么代表矢量作为二维数组?矢量是1D。取下额外的一组括号。 – Will
@将它计算机器学习任务的感知器决策边界的公式的一部分。我的猜测是我们必须有一个正确的形状供以后计算。但是,我看到他使用代码“X.dot(THETA.T)”来计算线性响应,并且我很难理解为什么他必须转置它。 – Alex