Что делает второй параметр numpy.linalg.pinv? - PullRequest
0 голосов
/ 27 декабря 2018

При поиске способа вычисления псевдообращений в numpy (1.15.4) я заметил, что numpy.linalg.pinv имеет параметр rcond, для которого в описании указано:

rcond: (…) array_like of float

Обрезание для малых значений в единственном числе.Сингулярные значения, меньшие (по модулю), чем rcond * major_singular_value (опять же, по модулю), устанавливаются в ноль.Вещает против стека матриц

Насколько я понимаю, если rcond - скалярное число с плавающей запятой, все записи в выводе pinv, который был бы меньше rcond, должны быть установлены в нольвместо этого (что было бы действительно полезно), но это не то, что происходит, например:

>>> A = np.array([[ 0., 0.3, 1., 0.],
                  [ 0., 0.4, -0.3, 0.],
                  [ 0., 1., -0.1, 0.]])

>>> np.linalg.pinv(A, rcond=1e-3)

array([[ 8.31963531e-17, -4.52584594e-17, -5.09901252e-17],
       [ 1.82668420e-01,  3.39032588e-01,  8.09586439e-01],
       [ 8.95805933e-01, -2.97384188e-01, -1.49788105e-01],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00]])

Что этот параметр на самом деле делает?И могу ли я получить только то поведение, которое на самом деле хочу, повторяя всю выходную матрицу снова?

1 Ответ

0 голосов
/ 27 декабря 2018

Под капотом псевдообратное вычисляется с использованием разложения по сингулярным числам .Исходная матрица A=UDV^T инвертируется как A^+=VD^+U^T, где D - диагональная матрица с положительными действительными значениями (единичными значениями).rcond используется для обнуления небольших записей в D.Например:

import numpy as np    

# Initial matrix
a = np.array([[1, 0], 
              [0, 0.1]])

# SVD with diagonal entries in D = [1. , 0.1]
print(np.linalg.svd(a))
# (array([[1., 0.],
#         [0., 1.]]), 
#  array([1. , 0.1]), 
#  array([[1., 0.],
#         [0., 1.]]))    

# Pseudoinverse
c = np.linalg.pinv(a)
print(c)
# [[ 1.  0.]
# [ 0. 10.]]

# Reconstruction is perfect
print(np.dot(a, np.dot(c, a)))
# [[1.  0. ]
#  [0.  0.1]]

# Zero out all entries in D below rcond * largest_singular_value = 0.2 * 1
# Not entries of the initial or inverse matrices!
d = np.linalg.pinv(a, rcond=0.2)
print(d)
# [[1. 0.]
# [0. 0.]]

# Reconstruction is imperfect
print(np.dot(a, np.dot(d, a)))
# [[1. 0.]
#  [0. 0.]]

Чтобы просто обнулить небольшие значения матрицы:

a = np.array([[1, 2],
              [3, 0.1]])

a[a < 0.5] = 0
print(a)
# [[1. 2.]
#  [3. 0.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...