【问题标题】:Julia error using convex package with diagind function使用带有 diagind 函数的凸包的 Julia 错误
【发布时间】:2018-04-22 12:47:24
【问题描述】:

我正在努力解决问题

d = 0.5 * ||X - \Sigma||_{Frobenius Norm} + 0.01 * ||XX||_{1}, 

其中 X 是对称正定矩阵,所有诊断元素都应为 1。XX 与 X 相同,但对角矩阵为 0。\Sigma 已知,我希望 X 的最小 d。

我的代码如下:

using Convex
m = 5;
A = randn(m, m); 
x = Semidefinite(5);
xx=x;
xx[diagind(xx)].=0;
obj=vecnorm(A-x,2)+sumabs(xx)*0.01;
pro= minimize(obj, [x >= 0]);
pro.constraints+=[x[diagind(x)].=1];
solve!(pro)

MethodError: 没有方法匹配 diagind(::Convex.Variable)

我只是通过约束矩阵中的对角元素来解决最优问题,但似乎 diagind 函数在这里不起作用,我该如何解决这个问题。

【问题讨论】:

  • 您能以数学形式添加您要解决的优化问题吗?
  • d=0.5*||X-\Sigma||_{Frobenius Norm}+0.01*||XX||_{1},X是一个对称正定矩阵,所有的诊断元素应为 1。XX 与 X 相同,但对角矩阵为 0。\Sigma 已知,我想要 X 的最小 d。
  • 好的,我在问题中添加了这个,请检查是否准确。
  • 是的,你完全理解。
  • 出于兴趣,如果您将其定义为sum(abs(XX))||XX||_1 是一个什么样的 1-norm?据我记得,运算符 (1,1)-norm 将是列和的最大值,而 Schatten 1-norm 是奇异值的总和。我忽略了什么吗?

标签: julia linear-algebra convex-optimization convex


【解决方案1】:

我认为以下内容可以满足您的要求:

m = 5
Σ = randn(m, m)
X = Semidefinite(m)
XX = X - diagm(diag(X))
obj = 0.5 * vecnorm(X - Σ, 2) + 0.01 * sum(abs(XX))
constraints = [X >= 0, diag(X) == 1]
pro = minimize(obj, constraints)
solve!(pro)

对于操作的类型:

  • diag 提取矩阵的对角线,作为向量
  • diagm 构造一个向量的对角矩阵

所以,要让XX 成为具有零对角线的X,我们从中减去X 的对角线。为了约束X 具有对角线1,我们比较它的对角线与1,使用==

最好尽可能保持不可变的值,而不是尝试修改事物。我不知道Convex 是否支持。

【讨论】:

  • 我看到fix variables 也有一种方法,也许您可​​以使用它来确保对角线的值。但我真的没有任何优化包的经验。
猜你喜欢
  • 2016-10-06
  • 2013-08-12
  • 1970-01-01
  • 2018-07-28
  • 2018-03-27
  • 2012-01-04
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多