Drukarnia.BLOG

Всіх вітаю! У сьогоднішній статті ми поговоримо про метод оберненої матриці та псевдо-обернену матрицю Мура-Пенроуза у бібліотеці 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@magnifiquedigitalworld

Прекрасний цифровий світ

95Довгочити
2KПерегляди
28Підписники
Підтримати
На Друкарні з 14 липня 2025

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

  • Відтепер для застосунків на Base44 можна додавати push-повідомлення

    Нещодавно компанія-розробник платформи Base44, яка дозволяє створювати застосунки за допомогою ШІ, заявила, що відтепер до своїх застосунків можна підключати push-повідомлення.

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

    It Новини
  • Оновлення проєкту Magnifique numérique

    Відтепер Magnifique numérique — це не лише про статті з програмування, а й новини про IT та технології. Це означає, що відтепер контент стане різноманітнішим.

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

    Оновлення
  • Метод zfill() у Python

    У цій статті ми розберемо метод zfill() у Python на основі практичних прикладів його використання.

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

    It

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

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

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

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