私は最適化の初心者であり、この分野のガイドを歓迎します。
15 個の行列 (つまり、Di
サイズ)があり、それらを加重平均する(n*m)
ための最適な重み (つまり、wi
Dt
実際、私の目的関数は次のようになります。
min [norm2(sum(wi * Di) - Dt) + norm2(W)]
for i=1 ... 15 s.t. sum(wi) = 1 , wi >= 0
Matlab でこの関数を最適化するにはどうすればよいですか?
私は最適化の初心者であり、この分野のガイドを歓迎します。
15 個の行列 (つまり、Di
サイズ)があり、それらを加重平均する(n*m)
ための最適な重み (つまり、wi
Dt
実際、私の目的関数は次のようになります。
min [norm2(sum(wi * Di) - Dt) + norm2(W)]
for i=1 ... 15 s.t. sum(wi) = 1 , wi >= 0
Matlab でこの関数を最適化するにはどうすればよいですか?
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*m
Di
Dt
n*m
Dt
[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 );
あなたのためにトリックを行う必要があります!