相关性Correlations 皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)

简介: 相关性Correlations

相关性Correlations


  • Correlations,相关度量,目前Spark支持两种相关性系数:皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)。相关系数是用以反映变量之间相关关系密切程度的统计指标。简单的来说就是相关系数绝对值越大(值越接近1或者-1), 当取值为0表示不相关,取值为(0~-1]表示负相关,取值为(0, 1]表示正相关。


  • Pearson相关系数表达的是两个数值变量的线性相关性, 它一般适用于正态分布。其取值范围是[-1, 1], 当取值为0表示不相关, 取值为[-1~0)表示负相关,取值为(0, 1]表示正相关。

公式


3.png

  • Spearman相关系数也用来表达两个变量的相关性,但是它没有Pearson相关系数对变量的分布要求那么严格, 另外Spearman相关系数可以更好地用于测度变量的排序关系。其计算公式为:

公式


6.png

1.根据输入类型的不同,输出的结果也产生相应的变化。如果输入的是两个RDD[Double],则输出的是一个double类型的结果;

如果输入的是一个RDD[Vector],则对应的输出的是一个相关系数矩阵。具体操作如下所示:


2.接下来我们先从数据集中获取两个series,这两个series要求必须数量相同,这里我们取莺尾花的前两个属性:


3.然后,我们调用Statistics包中的corr()函数来获取相关性,这里用的是"pearson" 皮尔逊,当然根据不同需要也可以选择"spearman" 斯皮尔曼等级:


4.上面介绍了求两个series的相关性,接下来介绍一下如何求 [相关系数矩阵]。

方法是类似的,首先还是先从数据集中获取一个RDD[Vector],为了进行对照,我们同样选择前两个属性:


5.我们调用Statistics包中的corr()函数,这里也同样可以选择"pearson"或者"spearman",得到相关系数矩阵:默认使用 皮尔逊

package basicstatistics
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg
import org.apache.spark.mllib.linalg.{Matrix, Vectors}
import org.apache.spark.mllib.stat.Statistics
import org.apache.spark.rdd.RDD
/**
 *
 *    相关性Correlations
 *
 *      Correlations,相关度量,目前Spark支持两种相关性系数:皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)。
 *  相关系数是用以反映变量之间相关关系密切程度的统计指标。简单的来说就是相关系数绝对值越大(值越接近1或者-1),
 *  当取值为0表示不相关,取值为(0~-1]表示负相关,取值为(0, 1]表示正相关。
 *      Pearson相关系数表达的是两个数值变量的线性相关性, 它一般适用于正态分布。其取值范围是[-1, 1], 当取值为0表示不相关,
 *  取值为[-1~0)表示负相关,取值为(0, 1]表示正相关。
 *
 *  公式  http://mocom.xmu.edu.cn/blog/58482eb8e083c990247075aa.png
 *
 *      Spearman相关系数也用来表达两个变量的相关性,但是它没有Pearson相关系数对变量的分布要求那么严格,
 *  另外Spearman相关系数可以更好地用于测度变量的排序关系。其计算公式为:
 *
 *  公式  http://mocom.xmu.edu.cn/blog/58482eb3e083c990247075a9.png
 */
object CorrelationsDemo {
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org").setLevel(Level.ERROR)
    val sc = new SparkContext("local[*]", "")
    /**
     *    根据输入类型的不同,输出的结果也产生相应的变化。如果输入的是两个RDD[Double],则输出的是一个double类型的结果;
     * 如果输入的是一个RDD[Vector],则对应的输出的是一个相关系数矩阵。具体操作如下所示:
     */
    // 接下来我们先从数据集中获取两个series,这两个series要求必须数量相同,这里我们取莺尾花的前两个属性:
    val seriesX: RDD[Double] = sc.textFile("/home/rjxy/IdeaProjects/spark/spark_mllib_course/src/main/resources/data/iris.data")
      .map(_.split(",")).map(p => p(0).toDouble)
    val seriesY: RDD[Double] = sc.textFile("/home/rjxy/IdeaProjects/spark/spark_mllib_course/src/main/resources/data/iris.data")
      .map(_.split(",")).map(p => p(1).toDouble)
    // 然后,我们调用Statistics包中的corr()函数来获取相关性,这里用的是"pearson" 皮尔逊,当然根据不同需要也可以选择"spearman" 斯皮尔曼等级:
    val seriesCorrelation: Double = Statistics.corr(seriesX, seriesY, "pearson")
    println(seriesCorrelation+" double")
    //-0.1594565184858299 spearman
    //-0.10936924995064387 pearson 说明数据集的前两列,即花萼长度和花萼宽度具有微小的  负相关性  。
    //  上面介绍了求两个series的相关性,接下来介绍一下如何求  [相关系数矩阵]。
    // 方法是类似的,首先还是先从数据集中获取一个RDD[Vector],为了进行对照,我们同样选择前两个属性:
    val data: RDD[linalg.Vector] = sc.textFile("/home/rjxy/IdeaProjects/spark/spark_mllib_course/src/main/resources/data/iris.data")
      .map(_.split(",")).map(p => Vectors.dense(p(0).toDouble, p(1).toDouble))
    //我们调用Statistics包中的corr()函数,这里也同样可以选择"pearson"或者"spearman",得到相关系数矩阵:
    //默认使用 皮尔逊
    val dataCorrelation: Matrix = Statistics.corr(data)
    println(dataCorrelation+"矩阵")
  }
}


目录
相关文章
ML之Spearman:Spearman相关系数(斯皮尔曼等级相关系数)的简介、案例应用之详细攻略
ML之Spearman:Spearman相关系数(斯皮尔曼等级相关系数)的简介、案例应用之详细攻略
ML之Spearman:Spearman相关系数(斯皮尔曼等级相关系数)的简介、案例应用之详细攻略
|
Java 程序员 Maven
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI C++ D-Bus Tools 完全使用教程指南
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI C++ D-Bus Tools 完全使用教程指南
745 0
|
Java 网络安全 开发工具
【Azure 事件中心】Event Hub 无法连接,出现 Did not observe any item or terminal signal within 60000ms in 'flatMapMany' 的错误消息
【Azure 事件中心】Event Hub 无法连接,出现 Did not observe any item or terminal signal within 60000ms in 'flatMapMany' 的错误消息
720 1
|
存储 云安全 安全
云端数据加密实践
【7月更文挑战第12天】云端数据加密是保障云端数据安全的重要手段。通过选择合适的加密方式、加强加密密钥管理、实施静态与动态数据加密、采用加密信息检索技术和应用层加密组件等措施,可以有效地保护云端数据的安全。未来,随着技术的不断进步和应用需求的多样化,云端数据加密技术将继续发挥其重要作用,为各种应用场景提供强大的安全保障。
|
SQL 数据采集 JSON
弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙
弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙
126271 137
|
算法 数据可视化 Python
使用 Python 模拟蒙特卡洛实验
使用 Python 模拟蒙特卡洛实验
669 1
|
存储 缓存 分布式计算
如何在 PySpark 中缓存数据以提高性能?
【8月更文挑战第13天】
800 8
|
机器学习/深度学习 vr&ar
技术心得:时间序列:ARIMA模型
技术心得:时间序列:ARIMA模型
2686 0
|
IDE 开发工具 数据安全/隐私保护
esp32CAM环境安装教程---串口驱动安装
esp32CAM环境安装教程---串口驱动安装
2637 0