2

私は最適化の初心者であり、この分野のガイドを歓迎します。

15 個の行列 (つまり、Diサイズ)があり、それらを加重平均する(n*m)ための最適な重み (つまり、wiDt

実際、私の目的関数は次のようになります。

min [norm2(sum(wi * Di) - Dt) + norm2(W)]
for i=1 ... 15    s.t. sum(wi) = 1 , wi >= 0

Matlab でこの関数を最適化するにはどうすればよいですか?

4

1 に答える 1

2

Matlab を使用して簡単に最適化できる単純な二次計画quadprog法について説明しています。

これがどのようになるか:

目的関数は[norm2(sum(wi * Di) - Dt) + norm2(W)]、 に対するいくつかの線形制約を受けwます。いくつかの簡略化された表記法を使用して書き直してみましょう。wを未知数の 15 行 1 列のベクトルとします。行 15 の行列 (各列は、単一の列として記述された行列の 1 つです) でありD、列ベクトルとして記述されたものと同じです。ここで、いくつかの線形代数 (||x||^2 = x'*x および argmin x が argmin x^2 と等しいという事実を使用)n*mDiDtn*mDt

[norm2(sum(wi * Di) - Dt)^2 + norm2(W)^2] =
(D*w-Dt)'*(D*w-Dt) + w'*w =
w'D'Dw - 2w'D'Dt + Dt'Dt + w'w =
w'(D'D+I)w - 2w'D'Dt + Dt'Dt

最後の項Dt'Dtは wrtwで一定であるため、最小化中に破棄できます。

H = 2*(D'*D+eye(15));
f = -2*Dt'*D;

制約に関してはsum(w)=1、これは次のように簡単に定義できます。

Aeq = ones(1,15);
beq = 1;

また、下限lb = zeros(15,1)により、すべてが保証されますw_i>=0

そして二次最適化:

w = quadprog( H, f, [], [], Aeq, beq, lb );

あなたのためにトリックを行う必要があります!

于 2015-04-13T08:58:19.847 に答える