[編集] "f" に関する部分が解決されました。これが私がしたことです:使用する代わりに:
X = (F * W' - Y);
f = X' * X;
私は今使用しています:
X = F*W;
A = X'*F*W;
B = -2*X'*Y;
Y1 = Y'*Y;
f = A + B + Y1
これにより、大幅な高速化が実現します。それでも、f の Hessian の問題は残ります。[/編集]
だから、Matlabで解決しようとしている二次最適化問題で、いくつかの深刻なパフォーマンス「問題」を抱えています。問題は最適化自体ではなく、ターゲット関数とヘッシアンの計算です。現在、このようになっています (F と Y はまったくランダムではなく、実際のデータを持ちます。また、必ずしも制約がないわけではありません。その場合、解はもちろん (F'F)^-1*F'*Y になるためです) ):
W_a = sym('w_a_%d', [1 96]);
W_b = sym('w_b_%d', [1 96]);
for i = 1:96
W(1,2*(i-1)+1) = W_a(1,i);
W(1,2*i) = W_b(1,i);
end
F = rand(10000,192);
Y = rand(10000,1);
q = [];
for i = 1:192
q = [q sum(-Y(:).*F(:,i))];
end
q = 2*q;
q = double(q);
X = (F * W' - Y);
f = X' * X;
H = hessian(f);
H = double(H);
A=[]; b=[];
Aeq=[]; beq=[];
lb=[]; ub=[];
options=optimset('Algorithm', 'active-set', 'Display', 'off');
[xsol,~,exitflag,output]=quadprog(H, q, A, b, Aeq, beq, lb, ub, [], options);
問題は、f と H の計算に時間がかかることです。
Matlabはこのようなものに最適化されているため、これを大幅に高速化する方法があるとは思っていません。しかし、誰かがいくつかのオープンライセンスソフトウェアを知っているかもしれません。それはMatlabとほぼ同じくらい高速なので、より高速なマシン(残念ながらMatlabライセンスはありません...)でそのソフトウェアを使用してfとHを計算し、Matlabに最適化を任せることができます。
今、私はこれでちょっと迷っています:/
事前にどうもありがとうございました。ここでは、「ソフトウェア xy を探す」のようないくつかのキーワードでも役に立ちます。