Разложение сингулярного вектора в 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 ().



Попробуйте это, а также попробуйте реализовать шаг за шагом, чтобы получить каждое значение для разложения по сингулярному вектору. Сказать по правде, я узнал это, сделав это. Как вы уже знаете, учимся на практике!

Увидимся позже :)