Spark PCA 顶级组件

Spark PCA top components

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

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

Spark 2.0+:

这应该是开箱即用的。有关详细信息,请参阅 SPARK-11530

火花 <= 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)))