Чтобы выполнить разложение матрицы по сингулярному значению, вы можете посмотреть на модуль .linalg` в numpy.
SVD матрицы разлагает ее на произведение трех матриц:
M = U S V *
M - ваша исходная матрица. S - прямоугольная диагональная матрица с («отсортированными») особыми значениями на диагонали. U и V известны как левый и правый сингулярные векторы соответственно.
Примечание: np.linalg.svd не возвращает S , но s , который является просто одномерным массивом, содержащим значения единственного числа.
Практическая реализация
Допустим, у вас есть (m x q) пространство объектов, представленное 2D-массивом X
, где X
- центрированная матрица. Вы можете рассчитать его SVD:
U, s, Vt = np.linalg.svd(X)
, где t
обозначает транспонирование V, а s - ваш «несортированный список единичных значений».
Вы можете затем спроецировать свое оригинальное пространство признаков на размеры n
, используя сингулярные векторы и отбрасывая особые векторы, которые сохраняют наименьшую дисперсию:
X_projected = X.dot(Vt.T[:,:n])
где X_projected
- теперь представление вашего пространственного объекта в нижнем n-мерном пространстве.
Важно, что вы можете вернуться из своего уменьшенного пространства функций в исходное пространство:
X_recovered = X_projected.dot(Vt[:,:n])
В частности, это можно использовать для измерения информации, потерянной в вашем сокращенном наборе функций, путем сравнения X_recovered
с вашим исходным набором функций (X
) для измерения таких вещей, как ошибка реконструкции.