根据不同矩阵中的值对矩阵的列进行排序
Sorting columns of a Matrix based on values in a different Matrix
我正在编写 java 代码来实现 Principal Component Analysis. I am modeling my matrices using Apache Commons Math3's RealMatrix class。
作为过程的一部分,使用 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⎦
我在 SO 和许多地方搜索了执行此排序的代码,并找到了以更复杂的方式执行 PCA 的程序包,或 2D Java 数组的手动排序例程。虽然我有能力编写这样的排序例程,但我会经常在大型数组上执行此操作,并希望有一个预先打包的高效解决方案。由于 PCA 是标准程序,因此这种矩阵运算应该很常见。我想看看是否有任何已经存在的包(例如 Apache Commons Math)包含执行此操作的方法。
允许我从旧矩阵重建新矩阵的替代解决方案是从特征值列中获取排序索引数组,例如,数组 [1,0] 告诉我排名最高的特征值在第 1 列,排名第二的特征值在第 0 列,依此类推
任何人都可以指出可以支持此功能的软件包吗?
看来我已经能够实施我建议的替代解决方案。我创建了一个列索引数组 ({0, 1}),然后根据与索引列对应的特征值对该数组进行排序。然后我简单地创建了一个新的 RealMatrix 并按照排序数组的顺序从旧的复制列:
for (index: sortedIndexArray) {
vPrime.setColumnVector(i, v.getColumnVector(index));
dPrime.setColumnVector(i, d.getColumnVector(index));
i++;
}
仍然想知道某个包中是否已经有一个方法可以做到这一点...
我正在编写 java 代码来实现 Principal Component Analysis. I am modeling my matrices using Apache Commons Math3's RealMatrix class。
作为过程的一部分,使用 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⎦
我在 SO 和许多地方搜索了执行此排序的代码,并找到了以更复杂的方式执行 PCA 的程序包,或 2D Java 数组的手动排序例程。虽然我有能力编写这样的排序例程,但我会经常在大型数组上执行此操作,并希望有一个预先打包的高效解决方案。由于 PCA 是标准程序,因此这种矩阵运算应该很常见。我想看看是否有任何已经存在的包(例如 Apache Commons Math)包含执行此操作的方法。
允许我从旧矩阵重建新矩阵的替代解决方案是从特征值列中获取排序索引数组,例如,数组 [1,0] 告诉我排名最高的特征值在第 1 列,排名第二的特征值在第 0 列,依此类推
任何人都可以指出可以支持此功能的软件包吗?
看来我已经能够实施我建议的替代解决方案。我创建了一个列索引数组 ({0, 1}),然后根据与索引列对应的特征值对该数组进行排序。然后我简单地创建了一个新的 RealMatrix 并按照排序数组的顺序从旧的复制列:
for (index: sortedIndexArray) {
vPrime.setColumnVector(i, v.getColumnVector(index));
dPrime.setColumnVector(i, d.getColumnVector(index));
i++;
}
仍然想知道某个包中是否已经有一个方法可以做到这一点...