原理
向量a→=(x1,x2,x3...xn)a→=(x1,x2,x3...xn),akak是a→a→中的任意元素,k=1,2,3⋯nk=1,2,3⋯n 例如:a→a→代表一个维度(特征)DimA,akak代表特征值。
向量b→=(x1,x2,x3...xn)b→=(x1,x2,x3...xn),bkbk是b→b→中的任意元素,k=1,2,3⋯nk=1,2,3⋯n 例如:b→b→代表一个维度DimB,bkbk代表特征值。均值:平均程度。
mean(DimA)=∑nk=1aknmean(DimA)=∑k=1nakn
方差:集中程度。除以n-1而不是n,这样我们能以较小的样本更好地逼近总体的方差,即统计上所谓的“无偏估计”。方差是标准差平方。
variance(DimA)=∑nk=1(ak−mean)2n−1variance(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(ak−meanA)(bk−meanB)n−1variance(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
}
}