2013-11-13 5 views
2

Я хочу сравнить лучшие 2 или 3 библиотеки для вычисления усеченной декомпозиции особых значений (SVD), то есть SVD, где сохраняются только k наибольших сингулярных значений. Кроме того, у меня есть эти ограничения:Лучший способ вычисления усеченного декомпозиции особых значений в java

  • Он должен быть библиотекой Java
  • Моих матриц разреженных (около 1% без нулевых значений)
  • Моих матриц довольно большой (обычно 10k х 5k)
  • Моих матриц также могут быть больше, чем высокие (5k х 10k)

Я столкнулся с довольно большим выбором библиотек, но, например, с Colt, я даже не знаю, если алгоритм SVD принимает учитывая, что моя матрица разрежена. Кроме того, я не нашел ни одной библиотеки, которая может напрямую вычислить усеченное решение (которое должно быть намного быстрее). На самом деле меня в основном интересует приблизительная матрица, полученная из усеченного SVD.

Спасибо по заранее за вашу помощь,

Romain Laroche

+0

colt определенно слишком медленный, в моих настройках. Я собираюсь попробовать джаму, но из того, что я читал до сих пор, это не должно быть лучше. – Maveric78f

+0

Кольт слишком медленный, но, что еще важнее, он работает только для прямоугольных матриц, которые выше ширины. – Maveric78f

+0

Я пытаюсь [EJML] (https://code.google.com/p/efficient-java-matrix-library/), следуя рекомендациям [benchmark] (https://code.google.com/p/java-matrix-benchmark /) java-библиотек матриц. Он работает намного лучше, чем Colt, если память Java не заполняет пространство. – Maveric78f

ответ

0

У меня была точно такая же проблема, и мое решение заключается в следующем:

  1. запустить СВД с Apache Commons Math на вашей матрице
  2. укоротить диагональную матрицу только держать top- к сингулярные значения
  3. усечение другие две матрицы лишь принимая top- к столбцов для первого и топ к строк для последнего одного
  4. умножить на три матрицы

Что вы получаете, это усеченное SVD исходной матрицы.

Ниже приведено полное решение, протестированное с матрицами, имеющими несколько тысяч строк/столбцов.

public static double[][] getTruncatedSVD(double[][] matrix, final int k) { 
    SingularValueDecomposition svd = new SingularValueDecomposition(new Array2DRowRealMatrix(matrix)); 

    double[][] truncatedU = new double[svd.getU().getRowDimension()][k]; 
    svd.getU().copySubMatrix(0, truncatedU.length - 1, 0, k - 1, truncatedU); 

    double[][] truncatedS = new double[k][k]; 
    svd.getS().copySubMatrix(0, k - 1, 0, k - 1, truncatedS); 

    double[][] truncatedVT = new double[k][svd.getVT().getColumnDimension()]; 
    svd.getVT().copySubMatrix(0, k - 1, 0, truncatedVT[0].length - 1, truncatedVT); 

    RealMatrix approximatedSvdMatrix = (new Array2DRowRealMatrix(truncatedU)).multiply(new Array2DRowRealMatrix(truncatedS)).multiply(new Array2DRowRealMatrix(truncatedVT)); 

    return approximatedSvdMatrix.getData(); 
} 
Смежные вопросы