Каков наилучший способ вычисления разложения по сингулярным числам (SVD) очень большой положительной матрицы (65M x 3,4M), где данные чрезвычайно редки?
Менее 0,1% матрицы не равно нулю. Мне нужен способ, который:
- впишется в память (я знаю, что онлайн методы существуют)
- будет рассчитан в разумные сроки: 3,4 дня
- будет достаточно точным, однако точность не является моей главной задачей, и я хотел бы иметь возможность контролировать, сколько ресурсов я вложил в него.
Было бы здорово иметь библиотеку Haskell, Python, C # и т. Д., Которая реализует это. Я не использую mathlab или R, но при необходимости я могу пойти с R.
Ответы:
Если он помещается в память, создайте разреженную матрицу в R, используя пакет Matrix , и попробуйте irlba для SVD. Вы можете указать, сколько сингулярных векторов вы хотите получить в результате, что является еще одним способом ограничения вычислений.
Это довольно большая матрица, но у меня были очень хорошие результаты с этим методом в прошлом.
irlba
довольно современное. Он использует неявно перезапущенный алгоритм би-диагонализации Ланцоша .Он может прожевать набор призовых данных netflix (480 189 строк по 17 770 столбцам, 100 480 807 ненулевых записей) за миллисекунды. Ваш набор данных в ~ 200 000 раз больше, чем набор данных Netflix, поэтому это займет значительно больше времени. Было бы разумно ожидать, что он может выполнить вычисления в течение нескольких дней.
источник
Matrix
? Попробуйте ограничить число значений, которые вы вычисляете ... может быть, просто посмотрите на топ-10?источник