版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34531825/article/details/52347220
PCA在Spark2.0用法比较简单,只需要设置:
.setInputCol(“features”)//保证输入是特征值向量
.setOutputCol(“pcaFeatures”)//输出
.setK(3)//主成分个数
注意:PCA前一定要对特征向量进行规范化(标准化)!!!
//Spark 2.0 PCA主成分分析
//注意:PCA降维前必须对原始数据(特征向量)进行标准化处理
package my.spark.ml.practice
import org.apache.spark.ml.feature.PCA
import org.apache.spark.ml.feature.PCAModel
import org.apache.spark.ml.feature.StandardScaler
import org.apache.spark.sql.Dataset
import org.apache.spark.sql.Row
import org.apache.spark.sql.SparkSession
public class myPCA {
public static void main(String[] args) {
SparkSession spark=SparkSession
.builder()
.appName("myLR")
.master("local[4]")
.getOrCreate()
Dataset<Row> rawDataFrame=spark.read().format("libsvm")
.load("/home/hadoop/spark/spark-2.0.0-bin-hadoop2.6" +
"/data/mllib/sample_libsvm_data.txt")
//首先对特征向量进行标准化
Dataset<Row> scaledDataFrame=new StandardScaler()
.setInputCol("features")
.setOutputCol("scaledFeatures")
.setWithMean(false)//对于稀疏数据(如本次使用的数据),不要使用平均值
.setWithStd(true)
.fit(rawDataFrame)
.transform(rawDataFrame)
//PCA Model
PCAModel pcaModel=new PCA()
.setInputCol("scaledFeatures")
.setOutputCol("pcaFeatures")
.setK(3)//
.fit(scaledDataFrame)
//进行PCA降维
pcaModel.transform(scaledDataFrame).select("label","pcaFeatures").show(100,false)
}
}
如何选择k值?
//PCA Model
PCAModel pcaModel=new PCA()
.setInputCol("scaledFeatures")
.setOutputCol("pcaFeatures")
.setK(100)//
.fit(scaledDataFrame);
int i=1;
for(double x:pcaModel.explainedVariance().toArray()){
System.out.println(i+"\t"+x+" ");
i++;
}
输出100个降序的explainedVariance(和scikit-learn中PCA一样):
1 0.25934799275530857
2 0.12355355301486977
3 0.07447670060988294
4 0.0554545717486928
5 0.04207050513264405
6 0.03715986573644129
7 0.031350566055423544
8 0.027797304129489515
9 0.023825873477496748
10 0.02268054946233242
11 0.021320060154167115
12 0.019764029918116235
13 0.016789082901450734
14 0.015502412597350008
15 0.01378190652256973
16 0.013539546429755526
17 0.013283518226716669
18 0.01110412833334044
...
大约选择20个主成分就足够了
随便做一个图可以选择了(详细可参考Scikit-learn例子)
http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html
Scikit中使用PCA
参考http://blog.csdn.net/u012162613/article/details/42192293
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
参数说明:
n_components:
意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
类型:int 或者 string,缺省时默认为None,所有成分被保留。
赋值为int,比如n_components=1,将把原始数据降到一个维度。
赋值为string,比如n_components=’mle’,将自动选取特征个数n,使得满足所要求的方差百分比。
copy:
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不 会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的 值会改,因为是在原始数据上进行降维计算。
whiten:
类型:bool,缺省时默认为False
意义:白化,使得每个特征具有相同的方差。关于“白化”,可参考:Ufldl教程
简单例子:
from sklearn import datasets
from sklearn.decomposition import PCA
iris = datasets.load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names
pca = PCA(n_components=3)
X_r = pca.fit(X).transform(X)
print "X_r"
print X_r
print "X"
print X
print "pca.explained_variance_ratio"
print pca.explained_variance_ratio_