CVXPY 奇异二次方的平方根
CVXPY Square root of Singular Quadratic
我需要为奇异半正定矩阵 C 建模 sqrt(x^T C x)。这里,建议使用 norm(Q*x),其中 Q 是从 C 的 Cholesky 分解获得的。
但是,np./scipy.linalg.cholskey 不适用于奇异矩阵。
PS,使用 SVD 或特征值分解对我的应用来说太慢了。
PS2,这个postNumpy Cholesky decomposition LinAlgError没有帮助,因为它没有提供解决方案。此外,问题中的矩阵似乎具有负特征值(而不是奇异矩阵)。
我找到了使用 ldl 分解的解决方案
L,d,_ = scipy.linalg.ldl(C)
d = np.diag(d).copy()
inds = d >= d.max()*1e-8
d = d[inds]
d = np.sqrt(d)
d.shape = (-1,1)
Q = d * L.T[inds]
loss = cp.norm(cp.matmul(Q, x))
虽然 ldl 分解需要 scipy >= 1.1。
我需要为奇异半正定矩阵 C 建模 sqrt(x^T C x)。这里,建议使用 norm(Q*x),其中 Q 是从 C 的 Cholesky 分解获得的。
但是,np./scipy.linalg.cholskey 不适用于奇异矩阵。
PS,使用 SVD 或特征值分解对我的应用来说太慢了。
PS2,这个postNumpy Cholesky decomposition LinAlgError没有帮助,因为它没有提供解决方案。此外,问题中的矩阵似乎具有负特征值(而不是奇异矩阵)。
我找到了使用 ldl 分解的解决方案
L,d,_ = scipy.linalg.ldl(C)
d = np.diag(d).copy()
inds = d >= d.max()*1e-8
d = d[inds]
d = np.sqrt(d)
d.shape = (-1,1)
Q = d * L.T[inds]
loss = cp.norm(cp.matmul(Q, x))
虽然 ldl 分解需要 scipy >= 1.1。