我有30x30矩阵作为基础矩阵(OD_b1),我也有两个基本向量(bg和Ag)。我的目标是优化矩阵(X),其尺寸为30X30,这样: 1)矢量(bg)和所有列的和的矢量之间的平方差最小化。 2)矢量(Ag)和所有行之和的矢量之间的平方差最小化。 3)矩阵(X)和矩阵(OD_b1)的元素之间的平方差异被最小化。
等式的数学形式如下:
我试过这个:
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)
我没有收到错误,但似乎卡住了。
是因为我有太多变数还是有其他原因?
提前致谢
答案 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
您可以执行以下操作:
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求解器更精确(没有使用有限差分的渐变)。此方法还允许您添加其他边界以及线性相等和不等式约束。
明确形成一阶条件的另一个建议也是一个好的:它也没有不精确的梯度问题(一阶条件是线性的)。由于其灵活性,我通常更喜欢二次模型。