mahout源码分析之DistributedLanczosSolver(四)rawEigen是什么
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit。
接上篇,eigen分解,额,太复杂了,人太浮躁了,静不下来分析(说java对矩阵操作支持度不足,额,好吧是外部原因)。
1. 前奏:
eigen分解的是triDiag矩阵,这个矩阵,上篇求得的结果是:
在这个网址可以使用eigen分解:http://www.yunsuanzi.com/cgi-bin/symmetric_eig_decomp.py,得到的结果如下:
其实这两个结果是一样的,只是列的顺序不一样。额,好吧,还有符号,好像有一点也不一样。额,确实是不一样,怎么办?用matlab试试吧,结果在matlab中的结果和java算出来的一模一样:
额,看来上面的那个网页的太不给力了,没算对。
接着往下看:
realEigen(0)的值是(调试):0.0118044890.001703710.0021007360.0142211470.0965415120.0025666820.0026147060.0001753140.001759590.0049406360.0007881250.002873480.995128632可见在误差范围内是一致的,而且realEigen的值的下标是和eigenVects的列标是相对的,比如realEigen是从下标零开始的,那么eigenVects就是从下标rank(最后的一个值)开始的;然后就是normalize了,这个函数是更新realEigen的值的,使用原始值除以(realEigen(0)的点积开根号);最后就是赋值了,把这个realEigen赋值给state的singularVectors;e的值就更好理解了,直接从eigenVals中取出相应的值然后乘以scaleFactor,然后开根号就ok了;最后把e值赋值给state的singularValue。这里给出state的singularVectors和singularValue的定义:
Path rawEigenVectorPath = new Path(outputPath, RAW_EIGENVECTORS); return new EigenVerificationJob().run(inputPath, rawEigenVectorPath, outputPath, outputTmpPath, maxError, minEigenvalue, inMemory, getConf() != null ? new Configuration(getConf()) : new Configuration());先初始化一个文件,然后直接调用EigenVerificationJob的run方法,那么,整个分析就转移到了EigenVerificationJob。附注:rawEigen是什么?根据上面的分析可以看出rawEigen其实就是state的singularVectors和singularValue的值而已;
分享,成长,快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990