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

Pet*_*ter 3 python numpy

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

\n\n
\n

rcond : (\xe2\x80\xa6) 类似浮点数的数组

\n\n

小奇异值的截止。小于 rcond * Maximum_singular_value(同样,以模数表示)的奇异值(以模数表示)\n 将设置为零。针对矩阵堆栈的广播

\n
\n\n

根据我的理解,如果rcond是一个标量浮点,则输出pinv小于的所有条目\nrcond应该设置为零(这将非常有用),但这不是发生的情况,例如:

\n\n
>>> A = np.array([[ 0., 0.3, 1., 0.],\n                  [ 0., 0.4, -0.3, 0.],\n                  [ 0., 1., -0.1, 0.]])\n\n>>> np.linalg.pinv(A, rcond=1e-3)\n\narray([[ 8.31963531e-17, -4.52584594e-17, -5.09901252e-17],\n       [ 1.82668420e-01,  3.39032588e-01,  8.09586439e-01],\n       [ 8.95805933e-01, -2.97384188e-01, -1.49788105e-01],\n       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个参数实际上有什么作用?我只能通过再次迭代整个输出矩阵来获得我真正想要的行为吗?

\n

Kon*_*tin 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.]]
Run Code Online (Sandbox Code Playgroud)

将矩阵的小值归零:

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

a[a < 0.5] = 0
print(a)
# [[1. 2.]
#  [3. 0.]]
Run Code Online (Sandbox Code Playgroud)