mahout 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