首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

mahout源码分析之DistributedLanczosSolver(4)rawEigen是什么

2013-10-30 
mahout源码分析之DistributedLanczosSolver(四)rawEigen是什么Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0

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,得到的结果如下:

mahout源码分析之DistributedLanczosSolver(4)rawEigen是什么

其实这两个结果是一样的,只是列的顺序不一样。额,好吧,还有符号,好像有一点也不一样。额,确实是不一样,怎么办?用matlab试试吧,结果在matlab中的结果和java算出来的一模一样:

mahout源码分析之DistributedLanczosSolver(4)rawEigen是什么

额,看来上面的那个网页的太不给力了,没算对。

接着往下看:



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



热点排行