numpy.linalg.pinv
numpy.linalg.pinv(a, rcond=1e-15)
Функция linalg.pinv() вычисляет псевдообратную матрицу (Мура-Пенроуза).
Для матрицы \(A\), псевдообратной матрицей является такая матрица \(A^+\), для которой выполняются следующие условия:
- \(A A^+A = A\);
- \(A^+A A^+ = A^+\);
- \((AA^+)^* = AA^+\), т.е. \(AA^+\) тоже эрмитова;
- \((A^+A)^* = A^+A\), т.е. \(A^+A\) тоже эрмитова;
Вычисление происходит на основе сингулярного (SVD) разложения матрицы a, если разложение невозможно, то возвращается ошибка LinAlgError.
-
- a - массив NumPy или подобнй массиву объект.
- Двумерный или многомерный массив. Если это многомерный массив, то он рассматривается как массив матриц с размером равным длине последних двух осей.
- rcond - массив NumPy или подобнй массиву объект.
-
Коэфициент "отбрасывания" малых значений массива a. Если какой-то элемент из a меньше чем
rcond*max(a)
то данный элемент будет обрабатываться как 0.
-
- результат - массив NumPy или число
- Псевдобратная матрица или массив Псевдообратных матриц.
Примеры
>>> 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