numpy.linalg.pinv的rcond参数是什么作用?

3
在查找如何计算 numpy 中的伪逆时,我注意到numpy.linalg.pinv有一个参数 rcond,其描述如下:

rcond :(...)浮点数数组

小奇异值截断。奇异值小于rcond * largest_singular_value(同样是模)的奇异值将被设置为零。广播与矩阵堆栈相对。

据我的理解,如果 rcond 是一个标量浮点数,则应该将输出中所有小于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个回答

6
在幕后,使用奇异值分解计算伪逆。初始矩阵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.]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接