降维:主成分分析(PCA)

定义:可以将特征向量投影到低维空间,实现对特征向量的降维

步骤:

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

结果截图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区