【问题标题】:Spark PCA top componentsSpark PCA 顶级组件
【发布时间】:2016-02-07 04:12:43
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    Spark 2.0+

    这应该是开箱即用的。详情请见SPARK-11530

    火花

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

    【讨论】:

    • 不错的一个! (替代方案:由于您有一个方阵(cov),您可以从特征方程中计算特征向量/特征值对,这比 svd 计算量要少得多)
    • @doug 你能详细解释一下吗?
    • 我昨天打开了一个 JIRA,以便将此功能包含在 Spark 中:issues.apache.org/jira/browse/SPARK-11530
    猜你喜欢
    • 2011-08-01
    • 2017-03-08
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多