为什么 G = H'*H 在 python 中不是正定的,其中 H 是全列等级?
How comes G = H'*H is not positive definite in python where H is full column rank?
我正在尝试用 python 中的 quadprog
库解决 QP 问题。它returns:
matrix G is not positive definite
但它被定义为 G=np.dot(H.T,H)
,其中 H
是一个 500×13 的垫子,并且是完整的列等级。看到这个:
G turns out to be deficient-rank
我知道这可能是一个数值问题,所以我应用 np.set_printoptions(precision=16)
来提高精度,但它没有用。所以我只是想知道我的代码有什么问题以及如何调整我的代码。
ps。这里所有的mat都是实数mat
如您所述,这可能是数值精度问题。当您计算 dot(H.T, H)
时,H
的元素相乘。如果其中一些元素足够小,则它们的乘积可能非常小,以至于在数值上结果的排名低于预期。这是一个简单的示例,它使用形状为 (2, 2) 的数组 A
显示此效果:
In [56]: A = np.array([[1, 0], [0, 1e-12]])
In [57]: np.linalg.matrix_rank(A)
Out[57]: 2
In [58]: B = np.dot(A.T, A)
In [59]: np.linalg.matrix_rank(B)
Out[59]: 1
In [60]: B
Out[60]:
array([[1.e+00, 0.e+00],
[0.e+00, 1.e-24]])
请注意,set_printoptions
仅影响 NumPy 数组的显示方式。不影响计算精度。
如果您降低给予 matrix_rank
的容差,您将恢复排名 2 的估计值:
In [64]: np.linalg.matrix_rank(B, tol=1e-28)
Out[64]: 2
不过不知道对你有没有帮助。
我正在尝试用 python 中的 quadprog
库解决 QP 问题。它returns:
matrix G is not positive definite
但它被定义为 G=np.dot(H.T,H)
,其中 H
是一个 500×13 的垫子,并且是完整的列等级。看到这个:
G turns out to be deficient-rank
我知道这可能是一个数值问题,所以我应用 np.set_printoptions(precision=16)
来提高精度,但它没有用。所以我只是想知道我的代码有什么问题以及如何调整我的代码。
ps。这里所有的mat都是实数mat
如您所述,这可能是数值精度问题。当您计算 dot(H.T, H)
时,H
的元素相乘。如果其中一些元素足够小,则它们的乘积可能非常小,以至于在数值上结果的排名低于预期。这是一个简单的示例,它使用形状为 (2, 2) 的数组 A
显示此效果:
In [56]: A = np.array([[1, 0], [0, 1e-12]])
In [57]: np.linalg.matrix_rank(A)
Out[57]: 2
In [58]: B = np.dot(A.T, A)
In [59]: np.linalg.matrix_rank(B)
Out[59]: 1
In [60]: B
Out[60]:
array([[1.e+00, 0.e+00],
[0.e+00, 1.e-24]])
请注意,set_printoptions
仅影响 NumPy 数组的显示方式。不影响计算精度。
如果您降低给予 matrix_rank
的容差,您将恢复排名 2 的估计值:
In [64]: np.linalg.matrix_rank(B, tol=1e-28)
Out[64]: 2
不过不知道对你有没有帮助。