2013-06-27 67 views
0

我有一個excel文件,其中包含126行和5列滿數字,我必須使用該數據和SVD方法來預測5-10多行數據。我已經用Python實現SVD成功使用numpy的:在Python/R中使用SVD進行矩陣逼近和預測時間序列

進口numpy的從numpy的進口genfromtxt

my_data = genfromtxt('data.csv', delimiter=',') 

U, s, V = np.linalg.svd(my_data) 

print ("U:") 
print (U) 
print ("\nSigma:") 
print (s) 
print ("\nVT:") 
print (V) 

,輸出NP :

U: 
[[-0.03339497 0.10018171 0.01013636 ..., -0.10076323 -0.09740801 
    -0.08901366] 
[-0.02881809 0.0992715 -0...., -0.02920558 -0.04133748 
    -0.06100236] 
[-0.02501102 0.10637736 -0.0528663 ..., -0.0885227 -0.05408083 
    -0.01678337] 
..., 
[-0.02418483 0.10993637 0.05200962 ..., 0.9734676 -0.01866914 
    -0.00870467] 
[-0.02944344 0.10238372 0.02009676 ..., -0.01948701 0.98455034 
    -0.00975614] 
[-0.03109401 0.0973963 -0.0279125 ..., -0.01072974 -0.0109425 
    0.98929811]] 

Sigma: 
[ 252943.48015512 74965.29844851 15170.76769244 4357.38062076 
    3934.63212778] 

VT: 
[[-0.16143572 -0.22105626 -0.93558846 -0.14545156 -0.16908786] 
[ 0.5073101 0.40240734 -0.34460639 0.45443181 0.50541365] 
[-0.11561044 0.87141558 -0.07426656 -0.26914744 -0.38641073] 
[ 0.63320943 -0.09361249 0.00794671 -0.75788695 0.12580436] 
[-0.54977724 0.14516905 -0.01849291 -0.35426346 0.74217676]] 

但我不知道如何使用此數據預先確定我的價值觀。我用這鏈路http://datascientistinsights.com/2013/02/17/single-value-decomposition-a-golfers-tutotial/作爲參考但是這是在R.在他們用R預測值結束,但它們中的R用這個命令:

approxGolf_1 <- golfSVD$u[,1] %*% t(golfSVD$v[,1]) * golfSVD$d[1] 

這裏是IdeOne鏈接到整個R代碼裏面: http://ideone.com/Yj3y6j

我不是很熟悉R,所以任何人都可以讓我知道,如果在Python中有類似於上述命令的函數,或者解釋那個命令正在做什麼?

謝謝。

回答

1

我會用你鏈接的高爾夫球場數據。例如,設定階段:

import numpy as np 
A=np.matrix((4,4,3,4,4,3,4,2,5,4,5,3,5,4,5,4,4,5,5,5,2,4,4,4,3,4,5)) 
A=A.reshape((3,9)).T 

這給了你原來的9行,3列表的9洞成績爲3名球員:

matrix([[4, 4, 5], 
     [4, 5, 5], 
     [3, 3, 2], 
     [4, 5, 4], 
     [4, 4, 4], 
     [3, 5, 4], 
     [4, 4, 3], 
     [2, 4, 4], 
     [5, 5, 5]]) 

現在的奇異值分解:

U, s, V = np.linalg.svd(A) 

最重要的是要調查的是奇異值的向量s

array([ 21.11673273, 2.0140035 , 1.423864 ]) 

它示出了第一值比其他大得多,表明只有一個值相應的Truncated SVD表示原始矩陣A相當好。要計算這種表示形式,請將U的第1列乘以第一行V乘以第一個奇異值。這是R中最後引用的命令。這裏是在Python一樣的:

​​

這裏是這款產品的結果:

matrix([[ 3.95411864, 4.64939923, 4.34718814], 
     [ 4.28153222, 5.03438425, 4.70714912], 
     [ 2.42985854, 2.85711772, 2.67140498], 
     [ 3.97540054, 4.67442327, 4.37058562], 
     [ 3.64798696, 4.28943826, 4.01062464], 
     [ 3.69694905, 4.3470097 , 4.06445393], 
     [ 3.34185528, 3.92947728, 3.67406114], 
     [ 3.09108399, 3.63461111, 3.39836128], 
     [ 4.5599837 , 5.36179782, 5.0132808 ]]) 

關於矢量因素U[:,0]V[0,:]:打個比方,U可以被看作是一個表示洞的難度,而V編碼一個球員的實力。

+0

哇,你是一個天才,謝謝!你解釋得很好。我只有一條評論,當我在我的數據上使用它時,我的數據是一個126x5的矩陣,我得到這個錯誤:predictions = U [:,0] * s [0] * V [0 ,:] ValueError:操作數可能不能與形狀(126)(5)一起廣播。我正在使用我的帖子上面的SVD值 – Goose

+0

當我使用高爾夫球場數據時,一切正常,但你知道爲什麼我的數據顯示......在U的決心?這裏是我使用的數據:http://pastebin.com/YYAM35Pd。你如何控制它預測的數值?對於我的情況,它會預測126x5的更多數據行嗎?對於大量問題抱歉,我幾乎無法找到任何有關SVD的信息,這些信息並沒有超出我的頭腦。 – Goose

+0

在我的回答中,我還沒有談到*預測*,但SVD如何幫助用較少的數據表示數據的特徵,即與最大奇異值相對應的向量。請提出另一個關於預測問題的具體問題。簡而言之,您需要知道新的實例(高爾夫球場的難點),以便您可以使用'V'(玩家技巧)預測分數。 – ojdo