Вы описываете простое квадратичное программирование, которое можно легко оптимизировать с помощью quadprog
.
Вот как это происходит:
Ваша целевая функция [norm2(sum(wi * Di) - Dt) + norm2(W)]
подчинена некоторым линейным ограничениям на w
. Давайте перепишем его, используя некоторые упрощенные обозначения. Пусть w
будет вектором неизвестных размером 15 на 1. Пусть D
будет матрицей n*m
x15 (каждый столбец является одной из Di
матриц, которые у вас есть - записаны в виде одного столбца), а Dt
- это вектор n*m
x1 (такой же, как ваш Dt
, но записанный как вектор-столбец). ). Теперь немного линейной алгебры (используя тот факт, что ||x||^2 = x'*x и что argmin x эквивалентен argmin x^2)
[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
постоянен по отношению к w
и поэтому может быть отброшен во время минимизации, оставляя вас с
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 );
Должен сделать трюк для вас!
person
Shai
schedule
13.04.2015