使用SPARK执行PCA后恢复旧数据

时间:2015-08-05 06:46:17

标签: algorithm scala apache-spark pca

我正在使用PCA将矩阵m*n缩减为矩阵m*2

我正在使用apache spark site内的代码段进入我的项目,并且它可以正常工作。

import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.distributed.RowMatrix

val mat: RowMatrix = ...

    // Compute the top 2 principal components.
    val pc: Matrix = mat.computePrincipalComponents(2) // Principal components are stored in a local dense matrix.

    // Project the rows to the linear space spanned by the top 2 principal components.
    val projected: RowMatrix = mat.multiply(pc)

如果有办法获取旧数据,我还没有在API内看到。 为了了解哪些列PCA被选为主要组件。

是否有任何库函数可以执行此操作?

更新

如果PCA算法选择并转换了两列我的数据,我想知道如何验证此转换所引用的旧数据的哪些列?

实施例

multiDimensional Matrix:

0 0 0 2 4 
2 4 9 1 3 
3 9 3 2 7 
9 6 0 7 7

在PCA算法减少2维后,我将获得:

-1.4 3  
2 -4.0 
3 -2.9  
-0.9 6

说,如何理解PCA从原始数据中选择 ,as principal components, 哪些列进行还原?

提前致谢。

1 个答案:

答案 0 :(得分:2)

矩阵pc包含主要组件作为其列。根据文件:

  

行对应于观察,列对应于变量。主成分存储在大小为n×k的局部矩阵中。每列对应一个主成分,列按成分方差的降序排列。

因此,您可以通过执行

来查看 i -th列
val pc: Matrix = ...
val i: Int = ...

for(row <- 0 until pc.numRows) {
  println(pc(row, i))
}

<强>更新

如果您有输入矩阵mat =

0 0 0 2 4 
2 4 9 1 3 
3 9 3 2 7 
9 6 0 7 7

其中每行构成一个示例,每列构成变量,然后您可以计算PCA。变化最大的两个主要组成部分是pc =

0.6072    0.2049
0.3466    0.6626
-0.4674    0.7098
0.4343   -0.1024
0.3225    0.0689

每列构成投影方向以获得维数减少数据的单个维度。为了现在获得维数减少的数据,您计算mat * pc,它可以为您提供

2.1588    0.0706
-0.2041    9.5523
6.6652    8.9843
12.8425    5.5844

这是您在低维向量空间中投影时的数据。这里每行再次代表一个例子,每一列代表一个变量。

如果我已正确理解您的问题,那么您正在寻找矩阵pc的列,它们会告诉您每个原始维度对投影维度的贡献程度。投影只是原始数据与投影方向(pc列)的标量积。