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

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

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

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

c741e5b4409a589f0b1d6837a714bc7c.png

两个重要的要素

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

皮尔逊相关系数

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

c2c6b5947b4e7b6731c837c2c46a7a07.png

f5f8549036b1605e0cac639181d4a32e.png

Spearman等级相关系数:

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

bfddad8aad15e29fc22601a057406803.png

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

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

95f3d9b0a9e724a841cb9183c12c70d2.png

代码演示

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)

}

}

结果展示

0a1e9f9185bf8eb8e38f19df6829f23e.png

18f8896456b79efee90970b655fe98b3.png

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页