用fmincon优化matlab上的矩阵

时间:2016-05-05 15:11:27

标签: matlab optimization

我有30x30矩阵作为基础矩阵(OD_b1),我也有两个基本向量(bg和Ag)。我的目标是优化矩阵(X),其尺寸为30X30,这样: 1)矢量(bg)和所有列的和的矢量之间的平方差最小化。 2)矢量(Ag)和所有行之和的矢量之间的平方差最小化。 3)矩阵(X)和矩阵(OD_b1)的元素之间的平方差异被最小化。

等式的数学形式如下:

enter image description here

我试过这个:

 fun=@(X)transpose(bg-sum(X,2))*(bg-sum(X,2))+ (Ag-sum(X,1))*transpose(Ag-sum(X,1))+sumsqr(X_b-X);
[val,X]=fmincon(fun,OD_b1,AA,BB,Aeq,beq,LB,UB)

我没有收到错误,但似乎卡住了。

是因为我有太多变数还是有其他原因?

提前致谢

2 个答案:

答案 0 :(得分:1)

这是一个简单的,无约束的最小二乘问题,因此有一个简单的解决方案,可以表示为线性系统的解决方案。

我将向您展示(1)解决此问题的准确有效方法和(2)如何使用fmincon解决。

精确,有效的解决方案:

问题设置

就在我们在同一页面上,我按如下方式初始化变量:

n = 30;
Ag  = randn(n, 1);    % observe the dimensions
X_b = randn(n, n);
bg  = randn(n, 1);

代码:

A1 = kron(ones(1,n), eye(n));
A2 = kron(eye(n), ones(1,n));
A = (A1'*A1 + A2'*A2 + eye(n^2));
b = A1'*bg + A2'*Ag + X_b(:);
x = A \ b;                      % solves A*x = b
Xstar = reshape(x, n, n);

为什么会这样:

我首先重新制定了您的问题,因此目标是向量x,而不是矩阵X。注意z = bg - sum(X,2)等同于:

x = X(:)                        % vectorize X
A1 = kron(ones(1,n), eye(n));   % creates a special matrix that sums up
                                % stuff appropriately
z = A1*x;

同样,设置A2以使A2*x等同于Ag'-sum(X,1)。您的问题等同于:

minimize (over x) (bg - A1*x)'*(bg - A1*x) + (Ag - A2*x)'*(Ag - A2*x) + (y - x)'*(y-x)其中y = Xb(:)。也就是说,y是Xb的矢量化版本。

这个问题是凸的,一阶条件是最优的必要条件。取x的导数,该等式将定义您的解决方案!示例数学几乎等效(但稍微简单的问题如下):

minimize(over x) (b - A*x)'*(b - A*x) + (y - x)' * (y - x)

重写目标:

b'b- b'Ax - x'A'b + x'A'Ax +y'y - 2y'x+x'x

相当于:

minimize(over x) (-2 b'A - 2y'*I) x + x' ( A'A + I) * x

第一顺序条件是:

(A'A+I+(A'A+I)')x -2A'b-2I'y = 0
(A'A+I) x = A'b+I'y

你的问题基本相同。它具有第一顺序条件:

(A1'*A1 + A2'*A2 + I)*x = A1'*bg + A2'*Ag + y

如何使用fmincon

解决

您可以执行以下操作:

f = @(X) transpose(bg-sum(X,2))*(bg-sum(X,2)) + (Ag'-sum(X,1))*transpose(Ag'-sum(X,1))+sum(sum((X_b-X).^2));
o = optimoptions('fmincon');%MaxFunEvals',30000);
o.MaxFunEvals = 30000;
Xstar2 = fmincon(f,zeros(n,n),[],[],[],[],[],[],[],o);

然后您可以检查答案是否与以下内容大致相同:

normdif = norm(Xstar - Xstar2)

你可以看到差距很小,但基于线性代数的解决方案更精确:

gap = f(Xstar2) - f(Xstar) 

如果fmincon方法挂起,请尝试使用较小的n,以获得相信我的基于线性代数的解决方案更精确,方式更快等等... n = 30正在求解30 ^ 2 = 900变量优化问题:不容易。使用线性代数方法,你可以达到n = 100(即10000变量问题)或甚至更大。

答案 1 :(得分:0)

我可能会使用quadprog使用以下重构来解决这个问题(保持目标尽可能简单以解决问题"更少非线性")

min sum(i,v(i)^2)+sum(i,w(i)^2)+sum((i,j),z(i,j)^2)
v = bg - sum(c,x)
w = ag - sum(r,x)
Z = xbase-x

QP求解器更精确(没有使用有限差分的渐变)。此方法还允许您添加其他边界以及线性相等和不等式约束。

明确形成一阶条件的另一个建议也是一个好的:它也没有不精确的梯度问题(一阶条件是线性的)。由于其灵活性,我通常更喜欢二次模型。