SparkML之相关性分析--皮尔逊相关系数、Spearman

相关性分析是指对两个或多个具备相关性的变量元素进行分析,从而衡量两个变量因素的相关密切程度。

相关性的元素之间需要存在一定的联系或者概率才可以进行相关性分析。

但是,请记住,相关性不等于因果性

两个重要的要素
从非常直观的分析思路来说,比如分析身高和体重,我们会问个问题:.身高越高,体重是不是越重?问题细分为两个方向:1,身高越高,体重越重还是越轻。2,身高每增加 1 ,体重又是增加多少或减少多少。這就是相关性的两个重要要素:相关的方向和相关的强度。对于相关的方向很好理解,就是正相关、负相关还是无关。对于问题2,有不同的人产生了不同的 定义相关性强度的思想。

皮尔逊相关系数

皮尔逊相关系数全称为:皮尔逊积矩相关系数(Pearson product-moment correlation coefficient).该系数广泛用于度量两个变量之间的相关程度。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来.定义的公式如下:

 

Spearman等级相关系数:
具体函数的定义,可以参考文献1。下面对思想进行简单阐述:A 的身高149,在身高這一列秩为1(最矮)。同理后面的参数就是所说变量的秩。Spearman等级相关系数(rho)如下:

其中累加di平方就是A身高的秩减去体重的秩平方加上B身高的秩减去体重的秩平方。。。。。。。发现spearman等级相关系数,和具体的数值无关,之和其中的秩有关系,它适用于不能准确测量指标值而只能以严重程度,名词先后等等级参数来确定之间的相关程度。

对原始数据xi,yi按从大到小排序,记x'i,y'i为原始xi,yi在排序后列表中的位置,x'i,y'i称为xi,yi的秩次,秩次差di=x'i-y'i

 

代码演示

package mllib

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.stat.Statistics
import org.apache.spark.rdd.RDD
/**
  * Created by Administrator on 2017/6/1.
  */
object Correlations {
    def main(args: Array[String]) {
        val conf = new SparkConf().setAppName("test").setMaster("local")
        val sc = new SparkContext(conf)
        val sql  = new SQLContext(sc);

        val seriesX: RDD[Double] = sc.parallelize(Array(149.0,150.0,153.0,155.0,160.0,155.0,160.0,150.0))  // a series
        // must have the same number of partitions and cardinality as seriesX
        val seriesY: RDD[Double] = sc.parallelize(Array(81.0,88.0,87.0,99.0,91.0,89.0,95.0,90.0))

        // compute the correlation using Pearson's method. Enter "spearman" for Spearman's method. If a
        // method is not specified, Pearson's method will be used by default.
        val correlation: Double = Statistics.corr(seriesX, seriesY, "pearson")
        println(s"Correlation is: $correlation")

        val data: RDD[Vector] = sc.parallelize(
            Seq(
                Vectors.dense(8.0, 10.0, -11.0),
                Vectors.dense(2.0, 20.0, 200.0),
                Vectors.dense(5.0, 33.0, 366.0))//每行可以表示一个用户,每个特征的相关性
        )  // note that each Vector is a row and not a column

        // calculate the correlation matrix using Pearson's method. Use "spearman" for Spearman's method
        // If a method is not specified, Pearson's method will be used by default.
        val correlMatrix: Matrix = Statistics.corr(data, "pearson")
        println(correlMatrix.toString)
    }

}

结果展示 

 

 

posted @ 2017-06-06 11:12  亢奋的小马哥  阅读(3869)  评论(0编辑  收藏  举报