PCA简单的说,它是一种通用的降维工具。在我们处理高维数据的时候,
了能降低后续计算的复杂度,在“预处理”阶段通常要先对原始数据进行降维,
而PCA就是干这个事的 本质上讲,PCA就是将高维的数据通过线性变换投影到低维空间上去
PCA的原理就是将原来的样本数据投影到一个新的空间中,
相当于我们在矩阵分析里面学习的将一组矩阵映射到另外的坐标系下。
通过一个转换坐标,也可以理解成把一组坐标转换到另外一组坐标系下,
但是在新的坐标系下,表示原来的原本不需要那么多的变量,
只需要原来样本的最大的一个线性无关组的特征值对应的空间的坐标即可
一般来说,PCA降维后的每个样本的特征的维数,不会超过训练样本的个数,
因为超出的特征是没有意义的。
再说说我自己对PCA的理解吧:
在我调用spark的mlib时,对数据进行处理后得到结果,通过比较,其实
每列数据都是一个方差,通过各行之间数据的比较,如果数据之间相差
不大就认定其,对该事务的影响不大可以将其过滤掉,不必将这个维度
加入到后面的计算。值得注意的是在pca算法运行完后,会对数据重新进行
排序按方差的差异度大小,由大到小排列的,所以我们去除数据的时候也
十分方便只需要,在运行算法前设置下就行了。
代码:
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.clustering.KMeans
// $example on$
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix
/**
* Created by Administrator on 2016/8/11.
*/
object MyPCA {
def main(args: Array[String]) {
val conf =new SparkConf().setAppName("PCA").setMaster("local");
val sc = new SparkContext(conf)
// $example on$
val data = Array(
Vectors.dense( 5.0,1.0, 1.0, 3.0, 7.0),
Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0),
Vectors.dense(4.0, 1.0, 0.0, 6.0, 7.0))
val dataRDD = sc.parallelize(data, 2)
val mat: RowMatrix = new RowMatrix(dataRDD)
// 计算前5个主要成分.
// 存储在一个稠密矩阵。
// val pc: Matrix = mat.computePrincipalComponents(5)//可以通过它的值查看各个特征的相差程度,要是相差不大,就可以将该特征过滤
val pc: Matrix = mat.computePrincipalComponents(3)//通过上面的协方比较,只需要,保留前两个特征就ok
//得到的矩阵结果
val projected: RowMatrix = mat.multiply(pc)
//训练数据
val newdateRDD=projected.rows
// 打印出降维的数据
val collect = projected.rows.collect()
println("Projected Row Matrix of principal component:")
collect.foreach { vector => println(vector) }
val numClusters = 2 //将目标数据分成几类
val numIterations = 20//迭代的次数
//将参数,和训练数据传入,形成模型
// val clusters = KMeans.train(dataRDD, numClusters, numIterations)//训练原始数据
val clusters = KMeans.train(newdateRDD, numClusters, numIterations)//训练降维数据
//预测结果
// val result=clusters.predict(dataRDD)//预测原始数据
val result=clusters.predict(newdateRDD)//预测降维数据
//打印分类结果
result.foreach(println)
}
}
注意两次kmeans结果的比较,是一样的,说明运用PCA降维之后不会对结果有影响。