基于不同Matrix中的值对Matrix的列进行排序

时间:2015-07-22 21:21:37

标签: java sorting matrix pca

我正在编写实现Principal Component Analysis的java代码。我正在使用Apache Commons Math3的RealMatrix类对我的矩阵进行建模。

作为该过程的一部分,使用EigenDecomposition类计算协方差矩阵的特征值和特征向量。这产生两个矩阵:

  • Matrix v的列是特征向量
  • 矩阵d除了对角线上的特征值外都是0

示例:原始矩阵为:

⎡0.6166 0.6154⎤
⎣0.6154 0.7166⎦

分解后,特征向量矩阵v

⎡-0.7352 -0.6778⎤
⎣ 0.6779 -0.7352⎦

特征值对角矩阵d是

⎡0.4908 0.0000⎤
⎣0.0000 1.2840⎦

PCA程序的下一步是按特征值对列进行排序(按降序排列)。特别是因为第二列特征值(1.284)高于第一列(0.4908),我希望这是第一列,并对矩阵v和d进行排序,以便列以递减的特征值顺序出现:

结果v':

⎡-0.6778 -0.7352⎤
⎣-0.7352  0.6779⎦

结果d':

⎡0.0000 0.4908⎤
⎣1.2840 0.0000⎦

我搜索了SO和许多地方的代码进行了这种排序,并找到了以更复杂的方式执行PCA的软件包,或者用于2D Java数组的手动排序例程。虽然我能够编写这样的排序例程,但我会经常在大型阵列上执行此操作,并希望获得预先打包的高效解决方案。由于PCA是标准程序,因此该矩阵运算应该相当普遍。我希望看看是否有任何已经存在的软件包(例如,Apache Commons Math)包含执行此操作的方法。

允许我从旧矩阵重建新矩阵的替代解决方案是从特征值列获得排序索引数组,例如,数组[1,0]告诉我排名最高的特征值是在第1列中,排名第二的特征值在第0列等中

有人能指出我可以支持这个的套餐吗?

1 个答案:

答案 0 :(得分:0)

看起来我已经能够实现我建议的替代解决方案。我创建了一个列索引数组({0,1}),然后根据与索引列对应的特征值对该数组进行排序。然后我简单地创建了一个新的RealMatrix,并按照排序的数组的顺序从旧的列复制了列:

for (index: sortedIndexArray) {
  vPrime.setColumnVector(i, v.getColumnVector(index)); 
  dPrime.setColumnVector(i, d.getColumnVector(index)); 
  i++;
}

仍然想知道某个地方的某个方法中是否已有一个方法来执行此操作...