2015-03-25 40 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