Разложение сингулярного вектора в Numpy, Python
Из предыдущей публикации мы узнали, как выполнять SVD, разложение по сингулярным векторам с отличными примерами и иллюстрациями. Итак, сегодня мы рассмотрим материал по кодированию на Python, применив к нему практический подход, чтобы мы могли использовать его сразу после прочтения этой публикации. Давайте начнем!
Итак, у нас есть цель, приведенная ниже, и мы будем работать над двумя уравнениями, 1 и 2, чтобы выполнить SVD.
Прежде всего, в Python я загружу библиотеку Numpy и объявлю матрицу (которая будет массивом numpy) под именем «A».
import numpy as np A = np.array([[5,5], [-1, 7]])
A - это матрица 2x2. Нет, давайте объявим матрицу транспонирования A под названием «A_transpose».
A_transpose = A.T # A_transpose = A.transpose()
«.T» - это функция метода внутри библиотеки Numpy. Кроме того, вы можете использовать «.transpose ()», который выполняет ту же работу.
Теперь мы создадим первое условие уравнения и сохраним значение умножения матрицы под именем «eq_1».
eq_1 = np.matmul(A_transpose,A)
Мы можем легко умножить умножение нескольких матриц на встроенную функцию Numpy «matmul ()».
И мы можем проверить значение eq_1, распечатав его. (ниже)
Теперь мы перейдем к следующему шагу, вычислив собственные значения матрицы «eq_1» и получим значение для матрицы V.
Получить собственные значения довольно просто, поскольку нам нужно вызвать функцию в Numpy, Numpy.linalg.eig ().
eigen_value_1, eigen_value_2 = np.linalg.eig(eq_1)[0]
И два собственных значения хранятся под двумя разными именами: одно находится в «eigen_value_1», а другое - «eigen_value_2». Распечатаем!
Порядок между ними не имеет значения. Мы также можем сохранить 80 в первом собственном значении.
Затем давайте проверим каждый из результатов вычитания «единичной матрицы, умноженной на собственные значения» из нашего «eq_1».
В качестве единичной матрицы мы можем использовать numpy.eye (). (Звучит так же, глаз и я от личности)
c = eq_1- eigen_value_1*np.eye(2) d = eq_1-eigen_value_2*np.eye(2)
Из c и d мы можем найти вектор, который будет состоять из V.
В «c» мы видим, что если мы умножим первую строку [6, 18] на (-3) и добавим ее ко второй строке [18, 54], то она будет равна нулю. Это были бы ингредиенты для создания «V_1».
В «d» мы видим, что умножение второй строки на 3 и добавление ее к первой строке приведет к нулю. И «В_2» выдаст такой результат.
V_1 = np.array([-3/np.sqrt(10), 1/np.sqrt(10)]) V_2 = np.array([1/np.sqrt(10), 3/np.sqrt(10)]) V = np.vstack([V_1, V_2])
И наша «S» будет состоять из двух «собственных значений квадратного корня» по диагонали и нуля других
S = np.array([[np.sqrt(20),0], [0, np.sqrt(80)]])
Поскольку теперь у нас есть S и V, остается только U.
И исходя из этого, мы можем получить его, умножив A, V и обратную матрицу S.
S_inv = np.linalg.inv(S) U = np.matmul(AV, S_inv)
На самом деле есть более простой способ заработать эти ценности. Numpy поддерживает SVD с помощью Numpy.linalg.svd ().
Попробуйте это, а также попробуйте реализовать шаг за шагом, чтобы получить каждое значение для разложения по сингулярному вектору. Сказать по правде, я узнал это, сделав это. Как вы уже знаете, учимся на практике!
Увидимся позже :)