源英文链接 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的矩阵)矩阵为以下形式:
Hole | Par | Phil | Tiger | Vijay |
1 | 4 | 4 | 4 | 4 |
2 | 5 | 5 | 5 | 5 |
3 | 3 | 3 | 3 | 3 |
4 | 4 | 4 | 4 | 4 |
5 | 4 | 4 | 4 | 4 |
6 | 4 | 4 | 4 | 4 |
7 | 4 | 4 | 4 | 4 |
8 | 3 | 3 | 3 | 3 |
9 | 5 | 5 | 5 | 5 |
接下来我们尝试预测在给出某一洞后,预测每个运动员在该洞的得分。一种方法是给出每个洞的难度系数(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向量相乘得到最后的得分矩阵,看下面的等式:
| = |
| * |
|
相似的,我们需要对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因式分解如下:
| = |
| * |
| * |
|
其中以0.33开头的HoleDifficulty向量被叫做左奇异值向量,ScaleFactor是奇异值,以0.58开始的PlayAbility向量是右奇异值向量。如果我们正确的表示了这三个部分,并将它们相乘,那么我们就得到了最初的得分(计分板上的值)。这意味着我们的矩阵是一个1级矩阵,或者说它是一个简单的预测模型。
Page2
我们不能使用上面所说的一组因子来完全预测一个更加复杂的矩阵。在这种情况下,我们需要介绍第二组因子来改善我们的预测。为了该目的,我们从实际得分中减去预测的得分,然后得到剩余的得分。然后我们会发现能够最好预测剩余得分的第二组HoleDifficulty2和PlayAbility2值。
我们不去猜测HoleDifficulty和PlayerAbility因子和删除预测的得分,我们可以使用强大的算法来计算SVD因式分解。接下来我们来看2007年运动员锦标赛上Phil,Tiger,Vijay的前9洞的实际得分。
Hole | Par | Phil | Tiger | Vijay |
1 | 4 | 4 | 4 | 5 |
2 | 5 | 4 | 5 | 5 |
3 | 3 | 3 | 3 | 2 |
4 | 4 | 4 | 5 | 4 |
5 | 4 | 4 | 4 | 4 |
6 | 4 | 3 | 5 | 4 |
7 | 4 | 4 | 4 | 3 |
8 | 3 | 2 | 4 | 4 |
9 | 5 | 5 | 5 | 5 |
该得分的1-D SVD因式分解如下所述。为了让这个例子更好理解,我把ScaleFactor加入到了PlayerAbility和HoleDifficulty向量中,因此我们可以在这个例子中忽略掉ScaleFactor.
| = |
| * |
|
那么为什么洞的平均值(所有运动员在某个洞的得分平均值)和标准杆的比例(某个运动员的总得分/标准总分)不是恰好等于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)来表示它们是第二组因子。
| = |
| * |
|
Page3
这个例子中对于完整的SVD来言,矩阵(9个洞3个运动员)有三组因子。一般而言,对于一个m*n的矩阵,如果m>=n,那么至多有n个因子,所有我们的9*3的矩阵的因子不可能大于3,。下面是完整的SVD因式分解过程。
| = |
| * |
|
根据SVD约定,HoleDifficulty和PlayerAbility向量的长度应该为1,因此约束的SVD因式分解为:
| = |
| * |
| * |
|
Latent Semantic Analysis Tutorial
我们希望你对SVD以及它的使用有了初步的了解。下一步我们会介绍SVD在 Latent Semantic Analysis Tutorial.是如何使用的。虽然领域不同,但是思想是一致的。我们将会预测单词是如何在文档中出现的模式。