zoukankan      html  css  js  c++  java
  • 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)
        }
    
    }
    

    结果展示 

     

  • 相关阅读:
    CODING DevOps 高级架构师王炜入选木兰开源社区首批导师
    夯实基础,踏步云升 | 云原生 DevOps 入门必读
    Cloud Studio 2.0:云的开端
    持续演进的云原生应用交付
    CODING 携手 CoDesign:让设计与开发更简单
    代码扫描 | 把控代码质量的利器
    CODING 持续集成 | 自定义插件,满足你多样化的构建需求
    随便侃侃博客挖坑的事
    如何解决快应用页面滑动卡顿问题
    【HMS Core 6.0全球上线】华为3D建模服务(3D Modeling Kit),轻松构建高质量3D模型
  • 原文地址:https://www.cnblogs.com/xiaoma0529/p/6950511.html
Copyright © 2011-2022 走看看