Spark PCA顶级组件

时间:2015-11-06 04:38:42

标签: apache-spark statistics pca apache-spark-mllib

Dimensionality Reduction的spark mllib文档中,有一个关于PCA的部分描述了如何在spark中使用PCA。 computePrincipalComponents方法需要一个参数来确定我们想要的顶级组件的数量。

问题是我不知道我想要多少组件。我的意思是尽可能少。在其他一些工具中,PCA为我们提供了一个表格,显示我们是否选择了这3个组件,我们将覆盖95%的数据。那么Spark在它的库中是否具有此功能,或者如果它没有我如何在Spark中实现它?

1 个答案:

答案 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)))