Spark MLlib特征处理:均值、方差、协方差 ---原理及实战

原理

向量a=(x1,x2,x3...xn)a→=(x1,x2,x3...xn),akakaa→中的任意元素,k=1,2,3nk=1,2,3⋯n 例如:aa→代表一个维度(特征)DimA,akak代表特征值。 
向量b=(x1,x2,x3...xn)b→=(x1,x2,x3...xn),bkbkbb→中的任意元素,k=1,2,3nk=1,2,3⋯n 例如:bb→代表一个维度DimB,bkbk代表特征值。

均值:平均程度。 

mean(DimA)=nk=1aknmean(DimA)=∑k=1nakn


方差:集中程度。除以n-1而不是n,这样我们能以较小的样本更好地逼近总体的方差,即统计上所谓的“无偏估计”。方差是标准差平方。 

variance(DimA)=nk=1(akmean)2n1variance(DimA)=∑k=1n(ak−mean)2n−1


协方差:维度与维度之间的关系。标准差和方差一般用来描述一维数据。

协方差值含义:

cov(DimX,DimY) > 0 ,正相关。

cov(DimX,DimY) < 0 ,负相关。

cov(DimX,DimY) = 0 ,不相关。


维度DimA与DimB之间的协方差:

meanA:维度DimA均值

meanB :维度DimB均值

variance(DimA,DimB)=nk=1(akmeanA)(bkmeanB)n1variance(DimA,DimB)=∑k=1n(ak−meanA)(bk−meanB)n−1


假设数据集有三个维度X、Y、Z,则协方差矩阵:

CovMatrix(X,Y,Z)=cov(X,X)cov(Y,X)cov(Z,X)cov(X,Y)cov(Y,Y)cov(Z,Y)cov(X,Z)cov(Y,Z)cov(Z,Z)CovMatrix(X,Y,Z)=(cov(X,X)cov(X,Y)cov(X,Z)cov(Y,X)cov(Y,Y)cov(Y,Z)cov(Z,X)cov(Z,Y)cov(Z,Z))

实战

import org.apache.spark.mllib.linalg.distributed.RowMatrix
import org.apache.spark.mllib.linalg.{Matrix, Vector, Vectors}
import org.apache.spark.mllib.stat.MultivariateStatisticalSummary
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkContext, SparkConf}

object CovarianceExample {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("CovarianceExample").setMaster("local[8]")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

    //输入数据
    val data = Array(
      Vectors.dense(4.0, 2.0, 3.0),
      Vectors.dense(5.0, 6.0, 1.0),
      Vectors.dense(2.0, 4.0, 7.0),
      Vectors.dense(3.0, 6.0, 5.0)
    )

    // Array[Vector]转换成DataFrame
    val df = sqlContext.createDataFrame(data.map(Tuple1.apply)).toDF("features")

    // DataFrame转换成RDD
    val rddData=df.select("features").map { case Row(v: Vector) => v}

    // RDD转换成RowMatrix
    val mat: RowMatrix = new RowMatrix(rddData)

    // 统计
    val stasticSummary: MultivariateStatisticalSummary =mat.computeColumnSummaryStatistics()

    // 均值
    println(stasticSummary.mean)
    // 结果:3.5,4.5,4.0

    // 方差
    println(stasticSummary.variance)
    // 结果:1.6666666666666667,3.6666666666666665,6.666666666666667


    // 协方差
    val covariance: Matrix = mat.computeCovariance()
    println(covariance)
    // 结果:
    //  cov(dim1,dim1) cov(dim1,dim2) cov(dim1,dim3)
    //  cov(dim2,dim1) cov(dim2,dim2) cov(dim2,dim3)
    //  cov(dim3,dim1) cov(dim3,dim2) cov(dim3,dim3)
    //  1.6666666666666679   0.3333333333333357   -3.3333333333333304
    //  0.3333333333333357   3.666666666666668    -0.6666666666666679
    //  -3.3333333333333304  -0.6666666666666679  6.666666666666668
    // 结果分析:以cov(dim1,dim2)为例
    //  dim1均值:3.5  dim2均值:4.5
    //  val cov(dim2,dim3)=((4.0-3.5)*(2.0-4.5)+(5.0-3.5)*(6.0-4.5)+(2.0-3.5)*(4.0-4.5)+(3.0-3.5)*(6.0-4.5))/(4-1)
    //  cov(dim2,dim3)=0.3333333333333333 
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值