当我尝试计算 w^T * x
使用numpy,这也让我感到非常困惑。实际上,我自己无法实现。因此,这是NumPy中我们需要了解的少数陷阱之一。
就一维数组而言,行向量和列向量之间没有区别。他们是完全一样的。
看下面的例子,在所有情况下我们都得到相同的结果,这在线性代数的理论意义上是不正确的:
In [37]: w
Out[37]: array([0, 1, 2, 3, 4])
In [38]: x
Out[38]: array([1, 2, 3, 4, 5])
In [39]: np.dot(w, x)
Out[39]: 40
In [40]: np.dot(w.transpose(), x)
Out[40]: 40
In [41]: np.dot(w.transpose(), x.transpose())
Out[41]: 40
In [42]: np.dot(w, x.transpose())
Out[42]: 40
利用这些信息,现在让我们尝试计算向量的平方长度|w|^2
。
为此,我们需要转换w
为2D数组。
In [51]: wt = w[:, np.newaxis]
In [52]: wt
Out[52]:
array([[0],
[1],
[2],
[3],
[4]])
现在,让我们计算向量的平方长度(或平方大小)w
:
In [53]: np.dot(w, wt)
Out[53]: array([30])
请注意,我们使用的w
,wt
而不是wt
,w
(在理论线性代数等),因为与使用np.dot的形状失配(重量,W)。因此,向量的平方长度为[30]
。也许这是区分(numpy的)行和列向量的方法之一?
最后,我是否提到我想出了实施的方法w^T * x
?是的,我做到了:
In [58]: wt
Out[58]:
array([[0],
[1],
[2],
[3],
[4]])
In [59]: x
Out[59]: array([1, 2, 3, 4, 5])
In [60]: np.dot(x, wt)
Out[60]: array([40])
因此,如上所述,在NumPy中,操作数的顺序是相反的,这与我们在理论线性代数中研究的相反。
PS:numpy中的潜在陷阱
array([[1, 2, 3]])
而不是与其转置相等的进行测试。