当我尝试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
为二维数组。
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])
请注意,由于形状与 np.dot(wt, w) 的使用不匹配,我们使用w
,wt
而不是wt
, (如在理论线性代数中)。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 中的潜在陷阱