Singular Value Decomposition(SVD) Tutorial

来源:互联网 发布:信捷触摸屏编程实例 编辑:程序博客网 时间:2024/05/20 09:26

源英文链接 Singular Value Decomposition (SVD) Tutorial

Page1

当你浏览诸如 Singular Value Decomposition (SVD) on Wikipedia之类的网络资源时,你会发现很多函数方程,但是对于什么是SVD和它是如何工作的并没有一个直观的解释。SVD是将矩阵分解为一系列线性近似,以挖掘该矩阵隐藏结构的一种算法。

SVD非常有用,并已在应用中使用,譬如数据分析,信号处理,模式识别,图像压缩,天气预测,隐语义分析(LSA,也叫做LSI)


How does SVD work?

举一个简单的例子,拿高尔夫计分说,假设Phil,Tiger和Vijay(三个高尔夫高手)在一起玩9洞,他们每个人在每个洞都打了标准杆。它们的计分卡(也可以看做一个hole*player的矩阵)矩阵为以下形式:
HoleParPhilTigerVijay144442555533333444445444464444744448333395555

接下来我们尝试预测在给出某一洞后,预测每个运动员在该洞的得分。一种方法是给出每个洞的难度系数(HoleDifficulty factor)和每个运动员的能力系数(PlayerAbility factor)。那么实际得分就可以通过将这两个因子相乘得到:

PredictedScore = HoleDifficulty * PlayerAbility

在这个尝试中,我们把洞难度系数HoleDifficulty设为标准杆杆数,然后让每个运动员的能力系数都等于1.那么对于第一个洞而言,它的标准杆是4,那么我们的预期是一个能力系数为1的运动员能够得到4分。

PredictedScore = HoleDifficulty * PlayerAbility = 4 * 1 = 4

在整个计分板(矩阵)里,我们要做的就是将每个运动员的能力系数(全都默认为1)乘以洞的难度系数HoleDifficulty(在3到5之间),然后我们就能预测所有的得分。

实际上,这就是对计分板的一维SVD因式分解。我们可以把计分板(或矩阵)看做一个具有两个向量的乘积,这两个向量分别是HoleDifficulty和PlayAbility向量。当要预测某一个得分的时,只是简单地把相应的HoleDifficulty因子和PlayAbility因子相乘就可以了。遵循向量乘法规则,我们可以根据HoleDifficulty向量和PlayAbility向量相乘得到最后的得分矩阵,看下面的等式:


 PhilTigerVijay444555333444444444444333555=HoleDifficulty453444435*PlayerAbilityPhilTigerVijay111数学家更希望保持一切都是有序的,所以他们约定所有的向量应该缩减到长度为1。比如说,将PlayerAbility向量修改为让其所有元素的平方和为1,而不是当前的1*1+1*1+1*1=3了。为了实现该目的,我们需要把PlayerAbility中的每个元素都除以3的开方,这样会使每个元素平方时,该元素的平方值为1/3,各个元素的平方和就为1了。

相似的,我们需要对HoleDifficulty向量的每个元素都除以148的开方(148=4^2+5^2+3^2+4^2+4^2+4^2+4^2+3^2+a5^2,即向量HoleDifficulty的长度的平方),3的开方乘以148的开方等于21.07.完整的1-D SVD因式分解如下:


PhilTigerVijay444555333444444444444333555=
HoleDifficulty0.330.410.250.330.330.330.330.250.41*
ScaleFactor21.07*
PlayerAbilityPhilTigerVijay0.580.580.58

其中以0.33开头的HoleDifficulty向量被叫做左奇异值向量,ScaleFactor是奇异值,以0.58开始的PlayAbility向量是右奇异值向量。如果我们正确的表示了这三个部分,并将它们相乘,那么我们就得到了最初的得分(计分板上的值)。这意味着我们的矩阵是一个1级矩阵,或者说它是一个简单的预测模型。


Page2

我们不能使用上面所说的一组因子来完全预测一个更加复杂的矩阵。在这种情况下,我们需要介绍第二组因子来改善我们的预测。为了该目的,我们从实际得分中减去预测的得分,然后得到剩余的得分。然后我们会发现能够最好预测剩余得分的第二组HoleDifficulty2和PlayAbility2值。

我们不去猜测HoleDifficulty和PlayerAbility因子和删除预测的得分,我们可以使用强大的算法来计算SVD因式分解。接下来我们来看2007年运动员锦标赛上Phil,Tiger,Vijay的前9洞的实际得分。

HoleParPhilTigerVijay144452545533332444545444464354744438324495555

该得分的1-D SVD因式分解如下所述。为了让这个例子更好理解,我把ScaleFactor加入到了PlayerAbility和HoleDifficulty向量中,因此我们可以在这个例子中忽略掉ScaleFactor.

PhilTigerVijay3.954.644.344.275.024.692.422.852.663.974.674.363.644.284.003.694.334.053.333.923.663.083.633.394.555.355.00=HoleDifficulty4.344.692.664.364.004.053.663.395.00*PlayerAbilityPhilTigerVijay0.911.071.00注意HoleDifficulty的因子几乎等于三个运动员得分的平均值。比如拿第5个洞来说,所有的人都是4分,而HoleDifficulty对应的因子也是4.00。但是对于第6个洞,平均得分仍旧是4,但是HoleDifficulty因子变成了4.05。相似的是,PlayerAbility几乎等于每个运动员得到的总分在标准总分里的百分比。比如说,Tiger总共得到了39分,而标准杆是36,39/36 = 1.08,几乎等于他的PlayerAbility因子1.07.

那么为什么洞的平均值(所有运动员在某个洞的得分平均值)和标准杆的比例(某个运动员的总得分/标准总分)不是恰好等于1-D SVD因子呢?那是因为SVD在一个循环里进一步细化了这些数字。比如说,我们可以在开始假设HoleDifficulty为每个洞的得分平均值,那么在给出了这些HoleDifficulty数值后,什么样的PlayerAbility能最后地匹配这些得分?一旦我们有了这个答案(PlayerAbility值),我们可以回过头来找在给出了这些PlayerAbility后,什么样的HoleDifficulty能够最好的匹配这些得分?我们一直迭代这种计算方式,直到我们收敛到一组可以最好的预测这些得分的因子。SVD简化了这些过程,并马上给出了这些我们需要通过上述过程才能得到的收敛的因子。

SVD一个非常有用的属性是:根据标准矩阵相似策略(Frobenius 范数),它能够找到最好预测这个得分的一组最优因子。就是说,如果我们使用SVD来寻找矩阵的因子,就可以找到最好的因子。这个最优化属性意味着我们不必再去考虑是否还存在更好的因子以更好地预测得分。

现在我们来看实际得分和1-D估计的不同。一个正值的不同意味着实际值比预测值高,一个负值表示实际值比预测值低。比如说,在第一个洞中,Tiger得了4分,而预测值是4.64,因此我们得到了4-4.64 = -0.64。换句话说,我们必须给预测值加上-0.64才能得到实际值。

一旦得到了所有的不同,我们可以做同样的事情,使用公式HoleDifficulty2 * PlayerAbility2,来预测这些不同。由于这些因子在尝试预测这些不同,而它们是2-D的因子,因此我们在每个名字后面加了个2(例:HoleDifficulty2)来表示它们是第二组因子。



 PhilTigerVijay0.05-0.640.66-0.28-0.020.310.580.15-0.660.030.33-0.360.36-0.280.00-0.690.67-0.050.670.08-0.66-1.080.370.610.45-0.350.00=HoleDifficulty2-0.18-0.380.800.150.35-0.670.89-1.290.44*PlayerAbility2PhilTigerVijay0.82-0.20-0.53通过这些因子我们可以观察到一些很有趣的现象。注意第8个洞有最重要的HoleDifficulty2因子(-1.29)。那意味着这个洞最难预测。确实也是,因为没有一个运动员得到了标准杆。因为根据它的标准杆(HoleDifficulty-par )= (3.39-3)= 0.39,它是最难的洞,因此它也是最难预测的洞。Phil在该洞(洞8)打了一个小鸟球(低于标准杆1球),致使他的得分要比对他的预测得分少一杆(他得了2分,但是预测的是3.08)。其它较难预测的洞是洞3(0.80)和洞7(0.89),因为在这两个洞中,Vijay都击败了Phil,但总体来讲,Phil是打的最好的。

Page3

这个例子中对于完整的SVD来言,矩阵(9个洞3个运动员)有三组因子。一般而言,对于一个m*n的矩阵,如果m>=n,那么至多有n个因子,所有我们的9*3的矩阵的因子不可能大于3,。下面是完整的SVD因式分解过程。

 
PhilTigerVijay445455332454444354443244555=
HoleDifficulty 1-34.34-0.18-0.904.69-0.38-0.152.660.800.404.360.150.474.000.35-0.294.05-0.670.683.660.890.333.39-1.290.145.000.44-0.36*
PlayerAbility 1-3PhilTigerVijay0.911.071.000.82-0.20-0.53-0.210.76-0.62

根据SVD约定,HoleDifficulty和PlayerAbility向量的长度应该为1,因此约束的SVD因式分解为:



PhilTigerVijay445455332454444354443244555=
HoleDifficulty 1-30.350.09-0.640.380.19-0.100.22-0.400.280.36-0.080.330.33-0.18-0.200.330.330.480.30-0.440.230.280.640.100.41-0.22-0.25*
ScaleFactor 1-321.070002.010001.42*
PlayerAbility 1-3PhilTigerVijay0.530.620.58-0.820.200.53-0.210.76-0.62
Latent Semantic Analysis Tutorial

我们希望你对SVD以及它的使用有了初步的了解。下一步我们会介绍SVD在 Latent Semantic Analysis Tutorial.是如何使用的。虽然领域不同,但是思想是一致的。我们将会预测单词是如何在文档中出现的模式。


0 0