-1

我正在使用 Python 中的内核 PCA,我必须在将原始数据投影到主成分后找到值。我使用方程

 fv = eigvecs[:,:ncomp]
    print(len(fv))
    td = fv.T * K.T

其中 K 是维度 (150x150) 的内核矩阵,ncomp 是主成分的数量。当 fv 具有维度 (150x150) 时,代码工作得非常好。但是当我选择 ncomp 为 3 时,使 fv 的维度为 (150x3) ,出现错误,说明操作数不能一起广播。我参考了各种链接并尝试使用点积,就像 td=np.dot(fv.T,K.T). 我现在没有得到任何错误一样。但我不知道检索到的值是否正确......

请帮忙...

4

1 回答 1

3

*运算符取决于数据类型。在 Numpy数组上,它进行元素乘法(不是矩阵乘法);numpy.vdot()做两个向量的“点”标量积(返回一个简单的标量结果)

>>> import numpy as np
>>> x = np.array([[1,2,3]])
>>> np.vdot(x, x)
14
>>> x * x
array([[1, 4, 9]])

要将 2 个数组正确地作为矩阵相乘,请使用numpy.dot

>>> np.dot(x, x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: objects are not aligned
>>> np.dot(x.T, x)
array([[ 1,  4,  9],
       [ 4, 16, 36],
       [ 9, 36, 81]])
>>> np.dot(x, x.T)
array([[98]])

然后是numpy.matrix数组的一种特殊化,它*表示矩阵乘法**表示矩阵幂;所以一定要知道你在操作什么数据类型。


即将推出的 Python 3.5 将有一个新的运算符@,可用于矩阵乘法;然后您可以编写x @ x.T以替换上一个示例中的代码。

于 2015-03-25T11:26:58.227 回答