Друкарня від WE.UA

Всіх вітаю! У сьогоднішній статті ми поговоримо про метод оберненої матриці та псевдо-обернену матрицю Мура-Пенроуза у бібліотеці numpy, а конкретно розглянемо її пакет linalg для функцій з лінійної алгебри.

Встановлення

Windows:

pip install numpy

MacOS:

pip3 install numpy

Linux:

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() для використання цих математичних сутностей у коді. Також дізналися про вироджену матрицю і спосіб перевірки її виродженості.

Статті про вітчизняний бізнес та цікавих людей:

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Magnifique numérique
Magnifique numérique@nocturnal_reader we.ua/nocturnal_reader

Нічний читач

52Довгочити
587Прочитання
16Підписники
Підтримати
На Друкарні з 14 липня

Більше від автора

  • Створюємо стовпчикові графіки за допомогою plotly

    Всіх вітаю! У цій статті пропоную вам зануритися у графіки та візуалізацію на Python за допомогою plotly. На цей раз ми втілимо графік прослуховувань різних реп виконавців за місяць та графік з оцінками деяких альбомів за сайтом AOTY.

    Теми цього довгочиту:

    Програмування
  • Методи lower(), upper(), islower() та isupper() у Python

    Всіх вітаю! У цій невеличкій статті ми познайомимося із одразу чотирма методами для зміни регістру рядків у Python. Конкретно сьогодні ми ознайомимося із методами lower(), upper(), islower() та isupper().

    Теми цього довгочиту:

    Програмування
  • Методи startswith() та endswith() у Python

    Всіх вітаю! У цій статті ми розглянемо методи startwith() та endwith() у Python. Також наведемо приклади використання цих функцій безпосередньо у коді.

    Теми цього довгочиту:

    Програмування

Це також може зацікавити:

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити: