Optimization 如何在CVXOPT中运行MOSEK解算器

Optimization 如何在CVXOPT中运行MOSEK解算器,optimization,cvxpy,cvxopt,cvx,mosek,Optimization,Cvxpy,Cvxopt,Cvx,Mosek,我已经编写了一个小代码来使用CVXOPT进行简单的最小方差优化,您可以在下面看到整个代码 通过在CVXOPT中使用solvers.qp(p,q,G,h,A,b),代码运行良好,并找到了解决方案 solvers.qp(P, q, G, h, A, b) 我也想尝试一个不同的解算器,因此我使用了MOSEK,通过以下参数解决了相同的问题 solvers.qp(P, q, G, h, A, b, solver='mosek') 当使用solver='mosek'时,代码无法运行,它给了我以下错误

我已经编写了一个小代码来使用CVXOPT进行简单的最小方差优化,您可以在下面看到整个代码

通过在CVXOPT中使用solvers.qp(p,q,G,h,A,b),代码运行良好,并找到了解决方案

solvers.qp(P, q, G, h, A, b)
我也想尝试一个不同的解算器,因此我使用了MOSEK,通过以下参数解决了相同的问题

solvers.qp(P, q, G, h, A, b, solver='mosek') 
当使用solver='mosek'时,代码无法运行,它给了我以下错误

MOSEK错误1295:目标中的二次系数矩阵不是最小化问题预期的半正定矩阵

有人能解释我为什么会出现这个错误(我是否用错误的方式编码了一些东西?),以及是否有解决我与MOSEK面临的问题的方法

import numpy as np
import cvxopt as opt
import mosek
from cvxopt import matrix, solvers

def optimize_portfolio(n, Var_Cov):
        P = opt.matrix (Var_Cov)
        q = opt.matrix(np.matrix(np.zeros((n, 1))))
        G = opt.matrix(np.array(-np.identity(n)))
        h = opt.matrix(np.zeros((n,1)))             
        A = opt.matrix(1.0, (1,n))
        b = opt.matrix(1.0)

        # Finding a solution

        sol = solvers.qp(P, q, G, h, A, b, solver='mosek')
        return sol

### Parameters setup

Var_Cov = np.loadtxt('C:\VAR_COV.txt')
n = len (Var_Cov)

### solve
solution = optimize_portfolio(n, Var_Cov)

# Save Results
Port_Opt = np.matrix(solution['x'])

如果你把问题转移到另一个堆栈站点,也许你能找到答案。错误意味着P不是半正定的。由于我们没有您的完整输入数据,无法再多说了。@MichalAdamaszek谢谢,我知道错误的意思,但如果P不是半正定的,那么使用KKT的CVXOPT中的解算器如何找到解决方案?在KKT的情况下,对于负特征值,KKT不应该返回类似于KKT奇异矩阵的错误?如果有助于回答我的问题,我可以发布一个带有var_covar矩阵的txt文件question@kurag谢谢,我也发了同样的问题there@Marco_sbt你查过P的特征值了吗?也许有一个很小的负特征值,Mosek找不到Cholesky分解,或者其他一些数值问题。很难说。