为什么 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

不过不知道对你有没有帮助。