numpy.linalg.pinv

numpy.linalg.pinv(a, rcond=1e-15)

Функция numpy.linalg.pinv() вычисляет псевдообратную матрицу (Мура-Пенроуза).

Для матрицы \(A\), псевдообратной матрицей является такая матрица \(A^+\), для которой выполняются следующие условия:

  1. \(A A^+A = A\);
  2. \(A^+A A^+ = A^+\);
  3. \((AA^+)^* = AA^+\), т.е. \(AA^+\) тоже эрмитова;
  4. \((A^+A)^* = A^+A\), т.е. \(A^+A\) тоже эрмитова;

Вычисление происходит на основе сингулярного (SVD) разложения матрицы a, если разложение невозможно, то возвращается ошибка LinAlgError.

Параметры:
a - массив NumPy или подобнй массиву объект.
Двумерный или многомерный массив. Если это многомерный массив, то он рассматривается как массив матриц с размером равным длине последних двух осей.
rcond - массив NumPy или подобнй массиву объект.
Коэфициент "отбрасывания" малых значений массива a. Если какой-то элемент из a меньше чем rcond*max(a) то данный элемент будет обрабатываться как 0.
Возвращает:
результат - массив NumPy или число
Псевдобратная матрица или массив Псевдообратных матриц.
Смотрите так же:
linalg.inv, linalg.tensorinv

Примеры

>>> import numpy as np
>>> from numpy import linalg as LA
>>> 
>>> a = np.random.randint(0, 10, size = (3, 3))
>>> a
array([[0, 9, 1],
       [8, 2, 2],
       [1, 6, 3]])
>>> 
>>> a_pinv = LA.pinv(a)
>>> a_pinv
array([[ 0.03947368,  0.13815789, -0.10526316],
       [ 0.14473684,  0.00657895, -0.05263158],
       [-0.30263158, -0.05921053,  0.47368421]])
>>> 
>>> 
>>> #  Проверим выполнение 1-го условия:
... np.allclose(np.dot(a, np.dot(a_pinv, a)), a)
True
>>> 
>>> #  Проверим выполнение 2-го условия:
... np.allclose(np.dot(a_pinv, np.dot(a, a_pinv)), a_pinv)
True
>>> 
>>> #  Проверим выполнение 3-го условия:
... np.allclose(np.dot(a, a_pinv).T, np.dot(a, a_pinv))
True
>>> 
>>> #  Проверим выполнение 4-го условия:
... np.allclose(np.dot(a_pinv, a).T, np.dot(a_pinv, a))
True