gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:23 26 4
gpt4 key购买 nike

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

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

  • 矩阵 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 是一个标准过程,因此这种矩阵运算应该相当常见。我正在查看是否有任何已经存在的包(例如 Apache Commons Math)包含执行此操作的方法。

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

任何人都可以向我指出一个可以支持此功能的软件包吗?

最佳答案

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

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

仍然想知道包中是否已经有一个方法可以执行此操作...

关于java - 根据不同矩阵中的值对矩阵的列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com