我正在使用CVXR
建模包来解决一个凸优化问题。我确信问题是凸的,并且它遵循DCP规则,但是如果我使用CVXR
检查DCP规则,它将返回False
。但是,如果我处理完全相同的问题并使用CVXPY
检查它,它将返回True
(如预期的那样)
这里发生了什么?我附上一个在R和Python中这种行为的最小可复制示例:
CVXR
library(splines2)
library(CVXR)
deriv_basis = splines2::dbs(seq(0, 1, length.out=100), degree=3, intercept=T, df=30, derivs=2)
R = t(deriv_basis) %*% deriv_basis
beta_var = CVXR::::Variable(nrow(R))
q = CVXR::quad_form(beta_var, R)
CVXR::is_dcp(q)
[1] FALSE
write.table(x=R, file='R.csv'), row.names=F, sep=';')
CVXPY
import cvxpy
import pandas as pd
R = pd.read_csv('R.csv', sep=';').values
beta_var = cvxpy.Variable(R.shape[1])
q = cvxpy.quad_form(beta_var, R)
q.is_dcp()
Out[1]: True
有人能解释一下这里发生了什么,以及如何解决它,以便我可以使用CVXR吗
cvxpy
应该给出与G.Grothendieck所暗示的CVXR
相同的结果,因为DCP规则是相同的。最近版本的cvxpy
似乎出现了一些问题。我在cvxpy github上开了一期问题是R矩阵中的负特征值。如果您通过将其设置为零来解决这个问题,那么它满足dcp条件。我还修复了问题代码中的语法错误,并删除了多余的::。另一种可能性(未显示)是在pracma包中使用
nearest_spd
来调整R矩阵相关问题 更多 >
编程相关推荐