2015-07-22 3 views
1

Я пишу код Java для реализации Principal Component Analysis. Я моделирую свои матрицы, используя класс Apache Commons Math3 RealMatrix.Сортировка столбцов матрицы на основе значений в другой матрице

В качестве части процедуры собственные значения и собственные векторы ковариационной матрицы вычисляются с использованием класса EigenDecomposition. Это дает две матрицы:

  • столбцы матрицы V являются собственными векторами
  • Матрица д является все 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

Похоже, что я смог реализовать альтернативное решение, которое я предложил. Я создал массив индексов столбцов ({0, 1}), а затем отсортировал этот массив на основе собственного значения, соответствующего индексированному столбцу. Тогда я просто создал новый RealMatrix и скопированные столбцы из старого одного в порядке отсортированного массива:

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

Тем не менее интересно, если уже есть метод в пакете где-то, что делает это ...

Смежные вопросы