我正在尝试解决以下优化问题: 其中\rm \|\cdot\|_{norm}可以是 Frobenius 范数或\ell_1 -norm。
也就是说,属于半径为且中心为的球。实际上,我想用来解决我的问题,它是一个对称的半正定矩阵,因此,这是一个要解决的凸问题,但我找不到另一种方法来将该属性强加到我的解决方案中。
因此,我首先使用工具箱尝试使用拉格朗日表达式和约束\rm \|\cdot\|_{norm}minFunc的 Frobenius 范数,即,
但它在几次迭代后停止,对于一个小的S\in\mathrm{R}^{10\times10}有一个非常高的错误,大约10^{2 } 。
这是我的代码:
options.Method = 'cg';%'lbfgs';
options.maxIter = 100000000;
options.MaxFunEvals = 20000000000000;
lambda = 0.001;
x0 = rand(100,1);
Z = rand(15,10);
funObj = @(x)myfunc(x, lambda, Z);
[sol, f_val] = minFunc(funObj,x0,options);
function [f,g] = myfunc(x, lambda, Z)
s = reshape(x, [sqrt(numel(x)),sqrt(numel(x))]);
f = trace(s'*s) + trace(inv(s'*s)^2) + lambda* trace((s'*s - Z'*Z)*(s'*s - Z'*Z)');
g = 2*s -4*s*(inv(s'*s))^3 + lambda*(2*s*s'*s + 2*s'*s*s -2*s*Z'*Z -2*Z'*Z*s);
g = g(:);
end
我也尝试过minConf_PQN使用 -norm 约束,但返回此错误:
close to singular or badly scaled. Results may be inaccurate. RCOND = NaN
这是我使用的代码:
funObj = @(x)myfunc(x);
Z = rand(15,10);
S0 = load('S_true.mat')
L=S0'*S0-Z'*Z;
tau = sum(abs(L(:))); %true tau
r = reshape(Z'*Z, [size(Z,2)^2,1]);
funProj = @(w)sign(w).*projectRandom2C(abs(w'w-r),tau);
sol = minConf_PQN(funObj,x0,funProj,options);
function [f,g] = myfunc(x)
s = reshape(x, [sqrt(numel(x)),sqrt(numel(x))]);
f = trace(s'*s) + trace(inv(s'*s)^2);
g = 2*s -4*s*(inv(s'*s))^3;
g = g(:);
end
任何解决我的问题的帮助将不胜感激。