有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据不同矩阵中的值对矩阵的列进行排序

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

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

  • 矩阵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⎦

我在很多地方搜索了执行这种排序的代码,找到了以更复杂的方式执行PCA的包,或者是针对2D Java数组的手动排序例程。虽然我能够编写这样的排序例程,但我将在大型阵列上经常这样做,并希望得到一个预先打包的高效解决方案。由于PCA是一种标准程序,因此这种矩阵运算应该相当常见。我想看看是否有任何包已经存在(例如,ApacheCommonsMath),其中包含执行此操作的方法

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

有人能给我指一个能支持这一点的软件包吗


共 (1) 个答案

  1. # 1 楼答案

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

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

    仍然在想,包中是否已经有这样一个方法