оптимизация взвешенной суммы матриц

Я новичок в оптимизации и приветствую любое руководство в этой области.

У меня есть 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?


person roya    schedule 13.04.2015    source источник


Ответы (1)


Вы описываете простое квадратичное программирование, которое можно легко оптимизировать с помощью quadprog.

Вот как это происходит:

Ваша целевая функция [norm2(sum(wi * Di) - Dt) + norm2(W)] подчинена некоторым линейным ограничениям на w. Давайте перепишем его, используя некоторые упрощенные обозначения. Пусть w будет вектором неизвестных размером 15 на 1. Пусть D будет матрицей n*mx15 (каждый столбец является одной из Di матриц, которые у вас есть - записаны в виде одного столбца), а Dt - это вектор n*mx1 (такой же, как ваш 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
comment
@NereaGonzalezVazquez в данном конкретном случае квадратичное программирование больше подходит, чем генетический алгоритм. - person Shai; 13.04.2015
comment
Большое спасибо! Ваше объяснение было очень полезным для меня. - person roya; 14.04.2015
comment
Но у меня проблема с H. Для вычисления термина D' * D у меня есть две трехмерные матрицы (т. Е. (m * n * 15) * (n * m * 15)). Я сделал D(:,:,i)' * D(:,:,i) для i:1...15 в цикле, и результатом была матрица m * m * 15. Это правда? Если да, то как я могу добавить его с помощью глаза (15)? - person roya; 14.04.2015
comment
@roya - пожалуйста, внимательно прочитайте мое решение: я конвертирую матрицы mнаn в векторы m*nна1 (просто изменяя их форму), это упростит алгебру и позволит найти простое решение. - person Shai; 14.04.2015
comment
Ой. ты прав! Я этого не понял. Спасибо :) - person roya; 14.04.2015
comment
Наконец я закончил, но результат не имеет смысла, и один из wi случайно равен 1, а остальные - нулям. В моей задаче размер каждого Di равен 4500*4500. Вы считаете, что он слишком большой и оптимизация не удалась из-за размерности? - person roya; 14.04.2015
comment
@roya (1) размерность Di не имеет смысла - эффективная размерность вашей проблемы равна 15. Как вы можете видеть, коэффициенты quadprog имеют размер 15 на 15 и 15 на 1. (2) Попробуйте поставить quadprog с x0 - первоначальное предположение x0=ones(1,15)/15 - это повлияет на результат? (3) каковы типичные значения H и f? у вас может возникнуть проблема с очень большими коэффициентами, вызывающими числовую нестабильность. - person Shai; 14.04.2015
comment
@roya: если подумать, у вас есть L2 срок регуляризации на w и L1 ограничение (sum(w_i)=1) - в этом случае неудивительно, что вы получаете w, который является двоичным. Попробуйте удалить термин регуляризации L2 (компонент eye(15) из H) и посмотрите, что произойдет. - person Shai; 14.04.2015
comment
удаление члена регуляризации L2 не имело значения, но удаление ограничения L1 позволило выбрать значения разницы от 0 до 1,5. Теперь я должен сделать некоторые другие работы, чтобы оценить, хороши эти значения или нет. Спасибо за ваши полезные заметки. :) - person roya; 15.04.2015
comment
Извините за мой вопрос. Я использовал выученный W в своей работе. Но, похоже, выученные веса не подходят. Параметр итерации вывода quadprog всего 4. Это обычно? - person roya; 21.04.2015
comment
@roya Я не понимаю твоего вопроса. почему ваши выученные веса не в порядке? - person Shai; 21.04.2015
comment
Я имею в виду, что эти Wi, извлеченные из тренировочного набора, не работали для моего тестового набора. То есть сумма (wi * D'i) - D't больше, чем сумма (D'i) - D't. где D'i и D't извлекаются из тестового набора. - person roya; 21.04.2015
comment
Машинное обучение @roya иногда может быть сложным ... возможно ли, что обучающий набор и тестовый набор не взяты из одного и того же дистрибутива? - person Shai; 21.04.2015
comment
Мой набор данных — Corel 5K, который является самым известным в аннотации изображений, и его обучающий и тестовый наборы фиксированы. Но теперь я протестировал Wi на тренировочном наборе, и это было хорошо для него. Да, похоже, изучение весов не удается из-за моего набора данных. Все равно спасибо :) - person roya; 21.04.2015