PCA(主成分分析)
PCA是一个Estimator,是数据降维的常用算法之一,用来将数据集中的大量属性降低至可计算范围的数量,以便后续的对属性的数量有性能依赖的算法使用,所以在机器学习领域通常用来做数据预处理,但在传统统计分析领域,也有用PCA来直接做数据分析的(拿到主成分后做因子分析,得出各原始属性对主属性的贡献大小,从而在业务上确定那些属性比较重要)。
伪算法过程
PCA本质上就是个矩阵的坐标变换算法,所以永远是有解的。
PCA的计算过程相当于是把向量数据集变换到一个新的坐标系统中,使得所有数据的在第一个新坐标轴上的距离最小,从而找到第一主成分,再去掉第一主成分之后,利用同样的方式找到第二主成分,依次类推,最终达到预先定义的缩减后的维度。
Spark是根据通过计算奇异值分解(SVD)来计算结果矩阵的,该算法可以并发执行的。
使用场景
因为实际应用(非图像类数据)中原始维度规模相对行数来说是非常小的,这时PCA的运行性能主要依赖于数据集的行数,并不特别依赖于原始维度大小。
通过上述的算法可以看出,PCA是保留原始数据变化信息最多(变换坐标后数据方差最大)的降维算法,所以通常用来去除一些强相关的属性,保留下来的都是独立变化的属性,并且变化程度都会被尽可能的在降维后保留下来。如果需要降维后保留数据的显著类别信息,就需要用其他降维算法。
PCA算法对各个原始属性的取值范围规模敏感,所以实际处理过程中可能先需要做归一化处理,在Spark上,可以使用先StringIndexer和VectorIndexer将各个属性数据都变为频度索引编码值,这样在量刚上就统一了,相当于做了数据归一化。
PCA计算过程决定了不管最终维度设置成多少,对于同一数据集,得出的最终的结果矩阵,在每个主成分坐标上的分量值都是一致的,从而我们可以在执行fit前设置一个相对较大的最终维度值,然后根据一个阈值只保留在这个成分上的特征值(eigenvalue)比阈值大的成分,这样可以针对动态数据集最大限度的降低维度。特征值小到一定程度的特征向量方向本质上表明了这个成分属性的取值变化相当于他之前的成分属性已经可以忽略不计了。
参数
- inputCol: 需要降低维度的属性集合后的向量属性名称
- outputCol: 降低维度之后的向量属性名称 (默认值: pca_######_output)
- k: 降到k维 (必须>0)
model方法
- explainedVariance(): fit出的model可以使用该方法得到各个成分上的特征值(eigenvalue)。该值表达了数据集在各成分上的变化程度,越靠前的成分特征值就越大。
例子
1 | val data = Array( |