用fmincon在matlab上优化矩阵

用fmincon在matlab上优化矩阵,matlab,optimization,Matlab,Optimization,我有一个30x30矩阵作为基矩阵(OD_b1),我还有两个基向量(bg和Ag)。我的目标是优化尺寸为30X30的矩阵(X),以便: 1) 向量(bg)和所有列之和向量之间的平方差最小化。 2) 向量(Ag)和所有行总和向量之间的平方差最小化。 3) 矩阵(X)和矩阵(OD_b1)元素之间的平方差最小化 方程的数学形式如下: n = 30; Ag = randn(n, 1); % observe the dimensions X_b = randn(n, n); bg = randn(n

我有一个30x30矩阵作为基矩阵(OD_b1),我还有两个基向量(bg和Ag)。我的目标是优化尺寸为30X30的矩阵(X),以便: 1) 向量(bg)和所有列之和向量之间的平方差最小化。 2) 向量(Ag)和所有行总和向量之间的平方差最小化。 3) 矩阵(X)和矩阵(OD_b1)元素之间的平方差最小化

方程的数学形式如下:

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

我试过这个:

 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)
我没有发现错误,但它似乎被卡住了

是因为变量太多还是有其他原因


提前感谢

我可能会使用
quadprog
通过以下重新表述(保持目标尽可能简单,使问题“不那么非线性”)作为QP来解决这个问题:

QP解算器更精确(没有使用有限差分的渐变)。这种方法还允许您添加额外的边界以及线性等式和不等式约束


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

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

我将向您展示(1)解决此问题的精确有效方法,以及(2)如何使用
fmincon
解决此问题

精确、高效的解决方案: 问题设置 我们在同一页上,我初始化变量如下:

n = 30;
Ag  = randn(n, 1);    % observe the dimensions
X_b = randn(n, n);
bg  = randn(n, 1);
守则: 工作原理: 我首先重新表述了你的问题,所以目标是向量
x
,而不是矩阵
x
。观察
z=bg-和(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;
minimize(over x) (-2 b'A - 2y'*I) x + x' ( A'A + I) * x
类似地,
A2
的设置使得
A2*x
相当于
Ag'-sum(x,1)
。您的问题相当于:

x = X(:)                        % vectorize X
A1 = kron(ones(1,n), eye(n));   % creates a special matrix that sums up
                                % stuff appropriately
z = A1*x;
minimize(over x) (-2 b'A - 2y'*I) x + x' ( A'A + I) * x
最小化(超过x)(bg-A1*x)*(bg-A1*x)+(Ag-A2*x)*(Ag-A2*x)+(y-x)*(y-x)
其中
y=Xb(:)
。也就是说,y是Xb的矢量化版本

该问题是凸的,一阶条件是最优解的充分必要条件。取x的导数,方程将定义你的解!几乎相等的数学示例(但稍简单的问题如下所示):

改写目标:

b'b- b'Ax - x'A'b + x'A'Ax +y'y - 2y'x+x'x
相当于:

x = X(:)                        % vectorize X
A1 = kron(ones(1,n), eye(n));   % creates a special matrix that sums up
                                % stuff appropriately
z = A1*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) 

如果FMINCO方法挂起,请尝试使用更小的
n
,以获得信心,即我基于线性代数的解决方案更精确、速度更快等等。。。n=30是解决一个30^2=900变量的优化问题:不容易。使用线性代数方法,你可以达到n=100(即10000个变量的问题)甚至更大。

“但它似乎被卡住了。”你得到消息了吗
Matlab似乎被卡住在第3行了
?我们需要进一步澄清这意味着什么!;)@AnderBiguri它的行为就像它进入无限循环时一样,有没有更好的词来描述它?那么尝试使用
MaxIterations
选项。@AnderBiguri我尝试过,但没有成功您可以通过将
显示设置为
iter
来启用详细执行。每次迭代,matlab都会向你展示一些关于发生了什么的信息。我不知道如何将我的方程转换为适合quadprog的方程。如果有任何帮助,我会非常感激。我实际上有约束条件,X必须是正的,对角线上和下面的所有元素都必须设置为零,有没有办法使其与约束条件一起工作?@user2042145使用quadprog。步骤(1)从问题的修改版本开始(在向量x上进行优化):
minimize(overx)(bg-A1*x)*(bg-A1*x)+(Ag-A2*x)*(Ag-A2*x)+(y-x)*(y-x)
步骤(2)展开并收集术语,以便找到矩阵
H
和向量
f
,这样您的目标是
最小化0.5*x'*H*x+f'*x
。步骤(3)以
A*xfyi的形式编写约束,另一个针对凸问题的很酷的优化包是。