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)))
在 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)))