La4j неправильно вычисляет SVD матрицы?

У меня есть следующая матрица:

 0.003,0.013,0.022,0.013,0.003
 0.013,0.060,0.098,0.060,0.013
 0.022,0.098,0.162,0.098,0.022
 0.013,0.060,0.098,0.060,0.013
 0.003,0.013,0.022,0.013,0.003

Я пытаюсь использовать la4j для вычисления его разложения по сингулярным значениям, используя этот код:

  SingularValueDecompositor SVD = new SingularValueDecompositor(A);
  Matrix[] factorization = SVD.decompose();

  Matrix U = factorization[0];
  Matrix D = factorization[1];
  Matrix V = factorization[2];

Тем не мение, результат для U, D, V по порядку:

0.102,-0.826, 0.307,-0.456,-0.071
0.456,-0.175,-0.859,-0.155,-0.017
0.751, 0.423, 0.374,-0.337,-0.059
0.456,-0.320, 0.166, 0.740, 0.339
0.102,-0.076, 0.029, 0.327,-0.936

-----------
.2873094460,.0000000000,.0000000000,.0000000000,.0000000000
.0000000000,.0000000000,.0000000000,.0000000000,.0000000000
.0000000000,.0000000000,.0000000000,.0000000000,.0000000000
.0000000000,.0000000000,.0000000000,.0000000000,.0000000000
.0000000000,.0000000000,.0000000000,.0000000000,.0000000000

-----------
0.102,-0.051, 0.975,-0.148,-0.122
0.456, 0.870, 0.030, 0.186, 0.027
0.751,-0.481,-0.015, 0.374, 0.253
0.456,-0.079,-0.221,-0.627,-0.586
0.102, 0.061,-0.009,-0.640, 0.759

и эти три матрицы умножаются на

0.003,-0.001,0.028,-0.004,-0.004
0.013,-0.007,0.128,-0.019,-0.016
0.022,-0.011,0.210,-0.032,-0.026
0.013,-0.007,0.128,-0.019,-0.016
0.003,-0.001,0.028,-0.004,-0.004

который не является A. Я думаю, что часть проблемы может заключаться в том, что фактические диагональные сингулярные значения меньше 0,001 (кроме первого), поэтому они не появляются. (Причина, по которой десятичные числа составляют 10 цифр, заключается в том, что я установил десятичный формат таким образом). У меня вопрос: как мне обойти эту проблему и отобразить все единичные значения?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
80
1

Ответы 1

Разложение по сингулярным числам пытается разложить матрицу A на A = U * D * V', где V' - это транспонирование V.

// Instead of 
A = U.multiply(D.multiply(V));

// Try
A = U.multiply(D.multiply(V.transpose()));

// You should get back:
0.0030    0.0134    0.0220    0.0134    0.0030
0.0134    0.0597    0.0984    0.0597    0.0134
0.0220    0.0984    0.1620    0.0984    0.0220
0.0134    0.0597    0.0984    0.0597    0.0134
0.0030    0.0134    0.0220    0.0134    0.0030

Другие вопросы по теме