Я хотел бы вычислить разложение матрицы по сингулярным значениям, и порядок значений по сингулярности важен. По умолчанию, кажется, numpy.linalg.svd
(и scipy.linalg.svd
) сортирует значения в единственном числе, поэтому я не могу сказать, какой столбец соответствует каждому значению в единственном числе.
Пример:
import numpy as np
X = np.array([[-74, 80, 18, -56, -112],
[14, -69, 21, 52, 104],
[66, -72, -5, 764, 1528],
[-12, 66, -30, 4096, 8192],
[3, 8, -7, -13276, -26552],
[4, -12, 4, 8421, 16842]])
U, D, V = np.linalg.svd(X)
print(D)
Возвращает:
array([3.63684045e+04, 1.70701331e+02, 6.05331879e+01, 7.60190176e+00,
1.17158094e-12])
Когда мне нужно:
array([1.70701331e+02, 6.05331879e+01, 7.60190176e+00, 3.63684045e+04,
1.17158094e-12])
Есть ли способ получить сингулярные значения (D), чтобы они не сортировались? Отношение X = UDV ^ T также должно быть сохранено.
Редактировать: Здесь нужен был какой-то контекст, чтобы прояснить мое недоразумение. Я пытался воспроизвести Раздел 2.3, Метод Разложения Дисперсии в этой статье .