原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4024733.html
在spark mllib 1.1版本中增加stat包,里面包含了一些统计相关的函数,本文主要分析其中的相关系数计算的原理与实现:
一、基本原理
在stat包中实现了皮尔逊(Pearson)与斯皮尔曼(Spearman)两类相关系数的计算
(1)Pearson: (x,y)协方差/[(x标准方差)*(y标准方差)]
- 详情可以参考:http://zh.wikipedia.org/wiki/%E7%9A%AE%E5%B0%94%E9%80%8A%E7%A7%AF%E7%9F%A9%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0
- 协方差:
- 方差:
- 标准方差:
- 协方差与方差关系:
- 协方差矩阵:
- 因此,pearson相关系数的关键就是计算协方差矩阵即可
- (2)Spearman :等级变量之间的皮尔逊相关系数。将向量x、y根据值大小排序,然后根据排序后的序号计算Pearson相关系数
二、java api调用example
三、源码分析
1、相关系数计算接口
主要包含两类接口:(1)计算x,y两个向量相关系数 ,实际也会调用(2)的实现方法
(2)计算矩阵相关系数,会计算矩阵所有列向量之间的相关系数
2、Pearson相关系数实现
调用了computeCorrelationMatrix实现方法
在mllib的RowMatrix类中,实现了一些矩阵运算操作。computeCovariance函数就是求协方差矩阵
先调用了treeAggregate方法计算矩阵M的行数m与每列的和向量mean
computeGramianMatrix函数计算格拉姆矩阵,就是对矩阵M进行M^T *M的操作,最后根据GramianMatrix即可得到协方差矩阵
调用computeCorrelationMatrixFromCovariance函数,利用协方差与方差的关系计算出标准方差,
最后协方差/标准方差即可得出pearson相关系数
3、Spearman相关系数实现
调用computeCorrelationMatrix函数来计算Spearman相关系数
首先给矩阵X分配行号uid,列号columnIndex,并根据列号、列值排序
这段代码的功能是先调用zipWithIndex分配位置排名id,如果在一列中存在相同值,则需要用相同值的平均位置排名来当作它的实际位置排名,否则就用它的位置排名
最后,根据行号uid转化成DenseVector,调用pearson相关系数函数计算
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4024733.html