Всіх вітаю! У сьогоднішній статті ми поговоримо про метод оберненої матриці та псевдо-обернену матрицю Мура-Пенроуза у бібліотеці numpy, а конкретно розглянемо її пакет linalg для функцій з лінійної алгебри.
Встановлення
Windows:
pip install numpyMacOS:
pip3 install numpyLinux:
pip install numpyСтворення матриці
Після встановлення бібліотеки numpy її треба імпортувати, у даному випадку нам треба буде імпортувати не тільки саму бібліотеку безпосередньо, а й її пакет linalg, щоб працювати з матрицею. Імпортуємо те, що треба:
import numpy as np
from numpy.linalg import inv, pinvЗ пакету linalg імпортуємо функції inv() та pinv() — функції для знаходження оберненох матриці та псевдо-оберненої матриці Мура-Пенроуза.
Далі нам треба створити матрицю, яку ми і будемо використовувати у подальшому. Створюємо просту матрицю 3х3 або квадратну матрицю:
matrix = np.array([
[1, 5, -3],
[4, 2, 0],
[9, 8, -1]
])Ось таким чином ми створили матрицю 3х3. Від того, скільки ви додасте рядків всередині головних квадтаних дужок та значень залежить її розмір.
Знаходження оберненої матриці
Тож, переходимо до знаходження оберненох матриці за допомогою inv(). Перед цим корисно знати, що не для всіх матриць можна знайти обернену матрицю, а тільки якщо ця матриця не є виродженою.
Вироджена матриця — це така матриця, визначник якої дорівнює нулю. І для такої матриці не існує оберненої матриці.
Визначник матриці легко перевірити за допомогою того ж пакету linalg, а тічніше функції det(), яка знаходить визначник матриці. Імпортуємо з пакету linalg також і цю функцію:
from numpy.linalg import inv, pinv, detТепер знаходимо визначник нашої матриці. Просто передаємо функції det() нашу матрицю:
matrix_determinant = det(matrix)
print(f"Matrix determinant: {matrix_determinant}")В результаті бачимо, що вона не є виродженою, бо визначник не дорівнює нулю:
Matrix determinant: -24.000000000000004Отже, обернена матрця повина повинна існувати для такої матриці, як наша. Нарешті можемо без сумнівів застосувати функцію inv() та передати їх матрицю:
inverse_matrix = inv(matrix)
print(f"Invrse matrix: "
f"\n{inverse_matrix}")В результаті отримуємо таку обернену матрицю:
Invrse matrix:
[[ 0.08333333 0.79166667 -0.25 ]
[-0.16666667 -1.08333333 0.5 ]
[-0.58333333 -1.54166667 0.75 ]]Ще одним важливим критерієм для існування оберненої матриці є її розмір. Матриця повинна бути обов’язково квадратна, бо в іншому випадку вона не може мати оберненої матриці.
Взагалі квадратна матриця — це така матриця, яка має рівну кількість рядків і стовпців, як наша перша матриця.
Пропоную перевірити, чи буде працювати inv() для наступної матриці:
matrix = np.array([
[1, 5, -3],
[4, 2, 0],
])Отже, беремо обернену матрицю:
inverse_matrix = inv(matrix)
print(f"Inverse matrix: "
f"\n{inverse_matrix}")raise LinAlgError('Last 2 dimensions of the array must be square')
numpy.linalg.LinAlgError: Last 2 dimensions of the array must be squareЦя помилка якраз означає, що матриця повинна бути квадратною, щоб мати обернену матрицю.
Псевдо-обернена матриця Мура-Пенроуза
У минулій частині я казав, що оберненох матриці не існує для виродженої матриці, але це не означає, що ми не можемо її утворити. Тут на допомогу нам приходить так звана псевдо-матриця Мура-Пенроуза. Вона існує для абсолютно будь-якої матриці і навіть для виродженої.
Для прикладу створимо таку матрицю:
matrix_2 = np.array([
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]
])Тепер перевіряємо її визначник:
matrix_determinant_2 = det(matrix_2)
print(f"Matrix determinant 2: {matrix_determinant_2}")Результат:
Matrix determinant 2: 0.0Ось, визначник нової матриці нульвий, а це означає, що вона вироджена.
Нарешті використовуємо функцію pinv(), щоб знайти псевдо-обернену матрицю Мура-Пенроуза. Виклакаємо функцію і передаємо матрицю:
moore_penrose_matrix = pinv(matrix)
print(f"Moore-Penrose matrix: "
f"\n{matrix_2}")Як бачимо, для неї є псевдо-обернена матриця:
Moore-Penrose matrix:
[[1 1 1]
[1 1 1]
[1 1 1]]Якщо ж ми спробуємо отримати звичайну обернену матрицю через inv(), то отримаємо:
raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrixВона є виродженою, тому для неї не існує оберненої матриці, а тільки псевдо-обернена. Помилка прямо каже про те, що ця матриця вироджена.
Висновок
У ході цієї статті ми познайомилися з поняттями оберненої матриці та псевдо-оберненої матриці. Крім просто теоретичних знань, ми також застосовували функції inv() та pinv() для використання цих математичних сутностей у коді. Також дізналися про вироджену матрицю і спосіб перевірки її виродженості.