2015-03-25 39 views
0

我可以用Python内核PCA工作,我有原始数据投射到主components.I后找到的值,用公式2个numpy数组的点乘和正常乘法结果是否相同?

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

其中K为维度的核心矩阵(150×150), ncomp是主要组件的数量。当fv有尺寸(150x150)时,代码工作得很好。但是当我选择ncomp为3时,fv将以(150x3)为尺寸,出现错误,说明操作数无法一起广播。我提到的各种链接,并尝试使用点产品,如 td=np.dot(fv.T,K.T). 我现在没有得到任何错误。但我不知道检索的值是否正确或不...

plz帮助...

+0

是'fv'和'K''numpy'数组还是'matrix'子类? – hpaulj 2015-03-25 17:52:36

+0

fv和K是numpy数组...我得到作为打印fv和K类型时的类型。 – Pooja 2015-03-25 18:17:21

+0

不知道更多关于潜在任务,我们真的不能说是否逐元素乘法或点(矩阵乘积)是正确的。第一个要求匹配所有的维度,第二个匹配最后一个维度和第一个维度。 – hpaulj 2015-03-25 20:20:56

回答

2

*操作取决于数据类型。 On Numpy arrays它执行元素方式的乘法(not the matrix multiplication); 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来替换上一个例子中的代码。

+0

:Thnku为快速反应。!...那么我该怎么办才能纠正错误?我怎样才能乘以(3x150)*(150x150)矩阵。 – Pooja 2015-03-25 11:32:52

+0

thnks ..我的基本乘法,而不是矩阵..但我得到的错误作为操作数无法广播我的维度(3x150)*(150x150)...我坚持这个错误..plz帮助.. – Pooja 2015-03-26 06:27:54

+0

除非尺寸匹配,否则不能进行单元乘法。你期望它应该做什么? – 2015-03-26 08:23:34