05 August 2013
svd-奇异值分解

Mahout SVD-奇异值分解

author : xiajun

wiki介绍:
奇异值分解是线性代数中一种重要的矩阵分解,在信号处理、统计学等领域有重要应用。奇异值分解在某些方面与对称矩阵或Hermite矩阵基于特征向量的对角化类似。然而这两种矩阵分解尽管有其相关性,但还是有明显的不同。对称阵特征向量分解的基础是谱分析,而奇异值分解则是谱分析理论在任意矩阵上的推广。
假设M是一个m×n阶矩阵,其中的元素全部属于域 K,也就是 实数域或复数域。如此则存在一个分解使得

M = UΣV*

其中U是m×m阶酉矩阵;Σ是半正定m×n阶对角矩阵;而V*,即V的共轭转置,是n×n阶酉矩阵。这样的分解就称作M的奇异值分解。Σ对角线上的元素Σi,i即为M的奇异值。

常见的做法是将奇异值由大而小排列。如此Σ便能由M唯一确定了。(虽然U和V仍然不能确定。) http://zh.wikipedia.org/zh-cn/%E5%A5%87%E5%BC%82%E5%80%BC%E5%88%86%E8%A7%A3

mahout:
类:org.apache.mahout.math.hadoop.decomposer.DistributedLanczosSolver
运行:hadoop jar mahout-core.jar org.apache.mahout.math.hadoop.decomposer.DistributedLanczosSolver -i /hadoop/in -o /hadoop/out --numRows 10 --numCols 6 --rank 4 参数:
--input (-i)           输入文件路径参数
--output (-o)        输出文件路径
--numRows (-nr)  输入文件中user数(行去重复)
--numCols (-nc)   输入文件中item数(列去重复)
--rank (-r)       生成特殊值个数


0,101,2
0,102,3
0,103,4
1,103,2
1,105,1
1,106,3
2,102,2
2,104,4
此文件对应的参数是-nr 3 -nc 6

结果:
key: 0 eigenVector0, eigenvalue = 10.44030650891055:{0:0.001,1:0.002,2:0.003,3:0.004,4:0.0041,5:0.0043,6:0.005}
key: 1 eigenVector1, eigenvalue = 9.935582750351266:{0:0.5615726,1:0.38,2:-0.011921591,3:0.56157,4:-0.121,5:-0.1216,6:-0.121698624191844}
key: 2 eigenVector2, eigenvalue = 9.210383287176834:{0:0.016,1:0.23,2:-0.1170,3:0.016806008270189833,4:0.248919,5:0.2489193,6:0.24891939}
key: 3 eigenVector3, eigenvalue = 8.660254037844387:{0:0.01438,1:0.944,2:-0.20263534,3:0.014388,4:-0.06,5:-0.06651,6:-0.0665153151245189}
key: 4 eigenVector4, eigenvalue = 8.623545113635478:{0:4.492933802779929E-16,1:-1.0,2:7.7160,3:4.4929,4:4.065,5:4.065758146820641E-18}
eigenvalue为特征值,后面为特征向量

根据结果计算相似度:
r001=key:0 {0->1[(v0-v1)平方]} => pow((0.001-0.002),2)=>列0的值减列2的值然后开平方=>第一行的0,1列的计算
r101=key:1 {0->1[(v0-v1)平方]} => pow((0.001-0.002),2)=>列0的值减列2的值然后开平方
...
0,1的相似度=(r001+r101)开平方根



blog comments powered by Disqus