我正在研究内核方法,在某些时候我需要将一个非正半确定矩阵(即相似矩阵)组成一个PSD矩阵.我试过这种方法:
def makePSD(mat):
#make symmetric
k = (mat+mat.T)/2
#make PSD
min_eig = np.min(np.real(linalg.eigvals(mat)))
e = np.max([0, -min_eig + 1e-4])
mat = k + e*np.eye(mat.shape[0]);
return mat
Run Code Online (Sandbox Code Playgroud)
但如果我使用以下函数测试结果矩阵,它将失败:
def isPSD(A, tol=1e-8):
E,V = linalg.eigh(A)
return np.all(E >= -tol)
Run Code Online (Sandbox Code Playgroud)
我也尝试了其他相关问题中建议的方法(如何计算最近的正半正定矩阵?),但得到的矩阵也未能通过isPSD测试.
对于如何正确地进行正确的转换,您有什么建议吗?