Делать PCA в Java на большой матрице - PullRequest
5 голосов
/ 06 декабря 2011

У меня есть очень большая матрица (около 500000 * 20000), содержащая данные, которые я буду анализировать с помощью PCA. Для этого я использую библиотеку ParallelColt, но использую как разложение по сингулярным значениям, так и разложение по собственным значениям, чтобы получить собственные векторы и собственные значения ковариационной матрицы. Но эти методы тратят впустую кучу, и я получаю ошибки "OutOfMemory" ...

Также с помощью SparseDoubleMatrix2D (данные очень редки) ошибки все еще остаются, поэтому я спрашиваю вас: как я могу решить эту проблему?

Изменить библиотеку?

Ответы [ 3 ]

2 голосов
/ 06 декабря 2011

Вы можете вычислить PCA по правилу Оджи: это итеративный алгоритм, улучшающий оценку PCA, по одному вектору за раз.Это медленнее, чем обычный PCA, но требует, чтобы вы хранили только один вектор в памяти.Это также очень численно стабильно

http://en.wikipedia.org/wiki/Oja%27s_rule

0 голосов
/ 07 декабря 2011

Я создал несколько редких, инкрементальных алгоритмов для решения именно такой проблемы. Удобно, он построен на вершине Colt.

См. Класс HallMarshalMartin в библиотеке trickl-cluster ниже. Вы можете подавать ему куски строк за раз, так что это должно решить ваши проблемы с памятью.

Код доступен под лицензией GPL. Боюсь, я только что выпустил его, так что в нем мало документации, надеюсь, это довольно понятно. Есть тесты JUnit, которые должны помочь с использованием.

http://open.trickl.com/trickl-pca/index.html

0 голосов
/ 06 декабря 2011

Я не уверен, что смена библиотек поможет. Вам понадобятся дубли (8 байт на). Я не знаю, каким будет размер ковариационной матрицы в этом случае, но переключение библиотек не сильно изменит базовые вычисления.

Что такое параметр -Xmx при запуске? Как насчет размера пермейка? Возможно, вы можете увеличить их.

Алгоритм немедленно останавливается или работает какое-то время? Если это последнее, вы можете подключиться к процессу с помощью Visual VM 1.3.3 (скачать и установить все плагины). Это позволит вам увидеть, что происходит в куче, потоках и т. Д. Может помочь вам определить основную причину.

A Поиск Google для "Собственного значения Java больших матриц" обнаружил эту библиотеку от Google. Если вы прокрутите вниз комментарии, мне интересно, какой блок анализа собственных значений Ланцоша может помочь. Этого может быть достаточно, если вы можете получить подмножество собственных значений.

Эти реализации SVM утверждают, что они полезны для больших наборов данных:

http://www.support -vector-machines.org / SVM_soft.html

Не думаю, что вы можете запросить более 2 ГБ для JVM:

http://www.theserverside.com/discussions/thread.tss?thread_id=26347

Согласно Oracle, вам потребуется 64-битная JVM, работающая в 64-битной ОС:

http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit

...