gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:19:46 25 4
gpt4 key购买 nike

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

rcond : (…) array_like of float

Cutoff for small singular values. Singular values smaller (in modulus) than rcond * largest_singular_value (again, in modulus) are set to zero. Broadcasts against the stack of matrices

根据我的理解,如果rcond是标量 float ,则所有条目在 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]])

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

最佳答案

在幕后,使用 singular value decomposition 计算伪逆。 。初始矩阵 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.]]

关于python - numpy.linalg.pinv 的 rcond 参数有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53949202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com