在Dimensionality Reduction的spark mllib文档中,有一个关于PCA的部分描述了如何在spark中使用PCA。 computePrincipalComponents
方法需要一个参数来确定我们想要的顶级组件的数量。
问题是我不知道我想要多少组件。我的意思是尽可能少。在其他一些工具中,PCA为我们提供了一个表格,显示我们是否选择了这3个组件,我们将覆盖95%的数据。那么Spark在它的库中是否具有此功能,或者如果它没有我如何在Spark中实现它?
答案 0 :(得分:3)
Spark 2.0 + :
这应该是开箱即用的。有关详细信息,请参阅SPARK-11530。
Spark< = 1.6
Spark尚未提供此功能,但使用现有的Spark代码和解释方差的定义并不难实现。让我们说我们想要解释总方差的75%:
val targetVar = 0.75
首先让reuse Spark code计算SVD:
import breeze.linalg.{DenseMatrix => BDM, DenseVector => BDV, svd => brzSvd}
import breeze.linalg.accumulate
import java.util.Arrays
// Compute covariance matrix
val cov = mat.computeCovariance()
// Compute SVD
val brzSvd.SVD(u: BDM[Double], e: BDV[Double], _) = brzSvd(
new BDM(cov.numRows, cov.numCols, cov.toArray))
接下来,我们可以找到解释方差的一部分:
val varExplained = accumulate(e).map(x => x / e.toArray.sum).toArray
以及我们必须获得的组件数量
val (v, k) = varExplained.zipWithIndex.filter{
case (v, _) => v >= targetVar
}.head
最后,我们可以再次对U进行子集reusing Spark code:
val n = mat.numCols.toInt
Matrices.dense(n, k + 1, Arrays.copyOfRange(u.data, 0, n * (k + 1)))