Сортиране на колони от матрица въз основа на стойности в различна матрица

Пиша Java код за прилагане на Анализ на основните компоненти. Моделирам своите матрици, използвайки RealMatrix.

Като част от процедурата, собствените стойности и собствените вектори на ковариационната матрица се изчисляват с помощта на EigenDecomposition клас. Това произвежда две матрици:

  • Колоните на матрица v са собствените вектори
  • Матрица d е всичките нули с изключение на собствените стойности на диагонала

Пример: оригиналната матрица е:

⎡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 и т.н.

Може ли някой да ме насочи към пакет, който може да поддържа това?


person Daniel Widdis    schedule 22.07.2015    source източник


Отговори (1)


Изглежда, че успях да приложа алтернативното решение, което предложих. Създадох масив от индекси на колони ({0, 1}) и след това сортирах този масив въз основа на собствената стойност, съответстваща на индексираната колона. След това просто създадох нова RealMatrix и копирах колони от старата по реда на сортирания масив:

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

Все още се чудя дали вече има метод в пакет някъде, който прави това...

person Daniel Widdis    schedule 23.07.2015