1. 程式人生 > >Spark MLlib特徵處理:均值、方差、協方差 ---原理及實戰

Spark MLlib特徵處理:均值、方差、協方差 ---原理及實戰

原理

向量a=(x1,x2,x3...xn),aka中的任意元素,k=1,2,3n 例如:a代表一個維度(特徵)DimA,ak代表特徵值。
向量b=(x1,x2,x3...xn),bkb中的任意元素,k=1,2,3n 例如:b代表一個維度DimB,bk代表特徵值。

均值:平均程度。

mean(DimA)=nk=1akn

方差:集中程度。除以n-1而不是n,這樣我們能以較小的樣本更好地逼近總體的方差,即統計上所謂的“無偏估計”。方差是標準差平方。

variance(DimA)
=nk=1(akmean)2n1

協方差:維度與維度之間的關係。標準差和方差一般用來描述一維資料。

協方差值含義:

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)n1

假設資料集有三個維度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)

實戰

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 } }