定义:可以将特征向量投影到低维空间,实现对特征向量的降维
步骤:
1.数据预处理。这里预处理包含俩个部分:均值归一化和属性范围调整。均值归一化是相应属性减去平均值;而属性范围则在归一化基础上除以属性方差。
2.计算特征之间的协方差矩阵。该矩阵是一个n*n的对称矩阵。
3.计算协方差矩阵的特征值和特征向量。
4.将特征值从大到小排序。
5.保留最上面的N个特征向量。
6.将原数据映射到由N个特征向量构成的新空间中。
测试代码:
package com.iflytek.dimensionalityreduction
import org.apache.spark.sql.SparkSession import org.apache.spark.mllib.feature.PCA import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.linalg.Vectors import com.sun.xml.internal.stream.buffer.sax.Features import org.apache.spark.mllib.regression.LinearRegressionWithSGD object PCA { def main(args: Array[String]): Unit = { val sc=SparkSession.builder().appName("pca").master("local").getOrCreate() val dataFile=sc.sparkContext.textFile("E:\\test\\pca.txt", 10) val data=dataFile.map { line => val parts=line.split(",") LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split(" ").map (_.toDouble))) } val splits=data.randomSplit(Array(0.5,0.5), 11L) val training=splits(0) val test=splits(1) val numIterations=10 val pca=new PCA(data.first().features.size/2).fit(data.map(_.features)) val training_pca=training.map { p=> p.copy(features=pca.transform(p.features))} val test_pca=test.map { p => p.copy(features=pca.transform(p.features)) } val model=LinearRegressionWithSGD.train(training, numIterations) val model_pca=LinearRegressionWithSGD.train(training_pca, numIterations) val valueandpredictions=test.map { p => val score=model.predict(p.features) (score,p.label) } val valueandpredictions_pca=test_pca.map{ p=> val score=model_pca.predict(p.features) (score,p.label) } val MSE=valueandpredictions.map{case(v,p)=> Math.pow(v-p, 2) }.mean() val MSE_PCA=valueandpredictions_pca.map{case(v,p)=> Math.pow(v-p, 2) }.mean() println(MSE) println(MSE_PCA) } }
测试数据:pca.txt
1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2 1,0 0 1 2 3 4 2 3 1 2 3 1 2 4 1 4 1 1 4 1 4 0,1 2 4 2 4 2 5 1 4 1 5 3 4 5 2 4 1 1 3 1 4 0,1 2 3 4 6 2 3 1 3 4 5 2 4 2 5 2 5 2 4 6 2 1,2 3 2 4 2 4 2 4 2 4 2 5 2 3 2 4 2 5 5 5 2
结果截图: