SVD优点:简化数据、去除噪声、提高算法的结果
SVD是一个强大的降维工具,我们可以利用SVD来逼近矩阵并从中提取重要特征。通过保留矩阵80%~90%的能量,就可以得到重要的特征并去掉噪声。其中一个重要应用案例就是推荐引擎。
协同过滤的核心式相似度计算方法,有很多相似度计算方法都可以用于计算物品和用户之间的相似度。
3. 原理——矩阵分解
将原始的数据集矩阵data(m*n)分解成三个矩阵U(m*n), Sigma(n*m), VT(m*n):
对于Sigma矩阵:
- 该矩阵只用对角元素,其他元素均为零
- 对角元素从大到小排列。这些对角元素称为奇异值,它们对应了原始数据集矩阵的奇异值
- 这里的奇异值就是矩阵data特征值的平方根。
- 在某个奇异值的数目( 1个 )之后,其他的奇异值都置为0。这就意味着数据集中仅有r个重要特征,而其余特征则都是噪声或冗余特征。
- 确认r——启发式策略
- 保留矩阵中90%的能量信息,将奇异值平方和累加加到90%
- 若有上万奇异值,则保留2-3k
- 确认r——启发式策略
svd分解计算公式在numpy中会有
输入:
import numpy as np
from numpy import linalg as la
data = np.array(
[[4, 4, 0, 2, 2],
[4, 0, 0, 3, 3],
[4, 0, 0, 1, 1],
[1, 1, 1, 2, 0],
[2, 2, 2, 0, 0],
[1, 1, 1, 0, 0],
[5, 5, 5, 0, 0]])
U, Sigma, VT = la.svd(data)
print('Sigma:',Sigma)
print(U.shape,Sigma.shape,VT.shape)
Sig = np.mat([
[Sigma[0],0,0,0,0],
[0,Sigma[1],0,0,0],
[0,0,Sigma[2],0,0],
[0,0,0,Sigma[3],0],
[0,0,0,0,Sigma[4]]])
arr = U[:,:5] * Sig * VT[:5,:]
print(arr)
输出: