Python/R中基于SVD的矩阵逼近与时间序列预测
我有一个excel文件,它有126行5列的数字,我必须使用这些数据和SVD方法来预测更多的5-10行数据。我已经使用numpy成功地在Python中实现了SVD: 将numpy作为np导入 从numpy导入genfromtxtPython/R中基于SVD的矩阵逼近与时间序列预测,python,r,matrix,svd,Python,R,Matrix,Svd,我有一个excel文件,它有126行5列的数字,我必须使用这些数据和SVD方法来预测更多的5-10行数据。我已经使用numpy成功地在Python中实现了SVD: 将numpy作为np导入 从numpy导入genfromtxt my_data = genfromtxt('data.csv', delimiter=',') U, s, V = np.linalg.svd(my_data) print ("U:") print (U) print ("\nSigma:") print (s) p
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)
哪些产出:
U:
[[-0.03339497 0.10018171 0.01013636 ..., -0.10076323 -0.09740801
-0.08901366]
[-0.02881809 0.0992715 -0.01239945 ..., -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]]
但我不知道如何使用这些数据来预测我的价值。我使用此链接作为参考,但这是在R中。最后,他们使用R预测值,但在R中使用此命令:
approxGolf_1 <- golfSVD$u[,1] %*% t(golfSVD$v[,1]) * golfSVD$d[1]
approxGolf_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列表格,其中包含3名玩家9个洞的分数:
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 ])
结果表明,第一个值比其他值大得多,表明只有一个值对应的值很好地代表了原始矩阵A
。要计算此表示,请将U
的第1列乘以V
的第一行,再乘以第一个奇异值。这就是R中最后引用的命令所做的。在Python中也是如此:
U[:,0]*s[0]*V[0,:]
以下是该产品的结果:
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
则表示一个球员的力量。哇,你是个天才,谢谢!你解释得很好。我只有一个注释,当我在我的数据(126x5矩阵)上使用它时,我得到了这个错误:预测=U[:,0]*s[0]*V[0,:]值错误:操作数不能与形状(126)(5)一起广播。我在使用上面帖子中的SVD值,当我使用高尔夫球场数据时,一切都很好,但是,你知道为什么我上面的数据显示…,在美国?以下是我正在使用的数据:。你应该如何控制它预测了多少值?就我的情况而言,它会预测更多126x5行数据吗?很抱歉,有这么多的问题,我几乎找不到任何关于SVD的信息。我在回答中还没有提到预测,只是SVD如何帮助用较少的数据表示数据的特征,即对应于最大奇异值的向量。请具体询问另一个有关预测问题的问题。简而言之,你需要知道新的例子(高尔夫球场困难)的U
,这样你就可以使用V
(球员技能)来预测分数。好吧,我明白你的意思了。你知道我为什么会收到上面的错误吗?你确定你使用的是numpy矩阵而不是数组吗?如果U
和V
是数组,则必须使用dot
函数进行矩阵乘法,而*
运算符可能会因您提供的消息而失败。