Выполнение PCA с использованием оптимизации в Matlab

Я хотел бы найти основные компоненты матрицы данных X в Matlab, решив задачу оптимизации min||X-XBB'||, где норма — это норма Фробениуса, а B — ортонормированная матрица. Мне интересно, может ли кто-нибудь сказать мне, как это сделать. В идеале я хотел бы иметь возможность сделать это с помощью инструментов оптимизации. Я знаю, как найти главные компоненты другими методами. Моя цель — понять, как поставить и решить задачу оптимизации, ответом на которую является матрица. Буду очень признателен за любые предложения или комментарии.

Спасибо! МДж


person user765195    schedule 09.05.2012    source источник


Ответы (3)


Суть оптимизации в том, что существуют разные методы решения проблемы, некоторые из которых могут потребовать обширных вычислений.

Ваше решение, учитывая ограничения для B, состоит в том, чтобы использовать fmincon. Начните с создания файла для нелинейных ограничений:

function [c,ceq] = nonLinCon(x)
c = 0;
ceq = norm((x'*x - eye (size(x))),'fro'); %this checks to see if B is orthonormal.

затем вызовите процедуру:

B = fmincon(@(B) norm(X - X*B*B','fro'),B0,[],[],[],[],[],[],@nonLinCon)

где B0 является хорошим предположением о том, каким будет ответ.

Кроме того, вы должны понимать, что этот алгоритм пытается найти локальный минимум, который может быть не тем решением, которое вам в конечном итоге нужно. Например:

X = randn(1,2)
fmincon(@(B) norm(X - X*B*B','fro'),rand(2),[],[],[],[],[],[],@nonLinCon)
ans =
    0.4904    0.8719
    0.8708   -0.4909
fmincon(@(B) norm(X - X*B*B','fro'),rand(2),[],[],[],[],[],[],@nonLinCon)
ans =
    0.9864   -0.1646
    0.1646    0.9864

Поэтому будьте осторожны при использовании этих методов и постарайтесь выбрать хорошую отправную точку.

person Rasman    schedule 09.05.2012
comment
Спасибо @Расман. Я несколько небрежно сформулировал задачу. Неизвестной является матрица B с ограничением B'B = I, а минимизируемая функция равна f(B) = ||X - XBB'||. Итак, это действительно ограниченная оптимизация с нелинейным ограничением. Мне интересно, как это будет настроено в Matlab. Кроме того, просматривая документацию по процедурам минимизации, я не смог найти упоминания о матричных ответах. Где лучше всего мне об этом прочитать? Большое спасибо еще раз! - person user765195; 13.05.2012
comment
@user765195 user765195 хорошо, тогда тебе нужно использовать fmincon. Я отредактирую свой пост, чтобы отразить это. - person Rasman; 13.05.2012

Набор инструментов статистики имеет встроенную функцию 'princomp, которая выполняет PCA. . Если вы хотите узнать (в общем, без инструментов оптимизации), как создать свой собственный код для выполнения PCA, этот сайт — хороший ресурс.

Поскольку вы конкретно упомянули о желании использовать Optimization Toolbox и установить это как проблему оптимизации, существует очень надежный сторонний пакет, известный как CVX от Стэнфордского университета, который может решить проблему оптимизации, о которой вы говорите на этом сайте.

person kitchenette    schedule 09.05.2012
comment
Спасибо @kitchenette. Это очень полезная информация. Как я уже упоминал в своем вопросе, я хорошо знаком с princomp и другими стандартными методами поиска PCA. На самом деле, мой вопрос не столько о PCA, сколько о том, как настроить и решить определенные задачи оптимизации в Matlab. Пакет CVX выглядит очень многообещающе, но я надеялся на что-то более низкотехнологичное или в рамках набора инструментов оптимизации. - person user765195; 09.05.2012

У вас есть инструменты для оптимизации? Документация действительно хороша, просто попробуйте один из их примеров: http://www.mathworks.com/help/toolbox/optim/ug/brg0p3g-1.html.

Но в целом функция оптимизации выглядит так:

[OptimizedMatrix, OptimizedObjectiveFunction] = optimize( (@MatrixToOptimize) MyObjectiveFunction(MatrixToOptimize), InitialConditionsMatrix, ...optional constraints and options... );

Вы должны сами создать MyObjectiveFunction(), она должна принимать матрицу, которую вы хотите оптимизировать, в качестве входных данных и выводить скалярное значение, указывающее стоимость текущей входной матрицы. Большинство оптимизаторов попытаются минимизировать эту стоимость. Обратите внимание, что стоимость должна быть скалярной.

fmincon() - это хорошее место для начала, когда вы привыкнете к набору инструментов, и, если сможете, вам следует выбрать более конкретный алгоритм оптимизации для вашей проблемы.

Чтобы оптимизировать матрицу, а не вектор, преобразуйте матрицу в вектор, передайте этот вектор в свою целевую функцию, а затем измените его обратно в матрицу в вашей целевой функции.

Например, вы пытаетесь оптимизировать матрицу 3 x 3 M. Вы определили целевую функцию MyObjectiveFunction(InputVector). Передайте M как вектор:

MyObjectiveFunction(M(:));

И в MyObjectiveFunction вы должны изменить форму M (при необходимости), чтобы снова стать матрицей:

  function cost = MyObjectiveFunction(InputVector)
      InputMatrix = reshape(InputVector, [3 3]);

      %Code that performs matrix operations on InputMatrix to produce a scalar cost

      cost = %some scalar value
  end
person Dan    schedule 09.05.2012
comment
Спасибо @Dan за ваш ответ. Я не могу найти нигде в документации ссылки на матрицу, которую нужно оптимизировать. Это всегда вектор или скаляр. Где я могу найти хорошую ссылку на это? Спасибо еще раз! - person user765195; 13.05.2012
comment
Скорее всего, вы можете просто преобразовать свою матрицу в вектор, передать ее в свою целевую функцию, а затем изменить ее в матрицу внутри целевой функции. Это должно сработать для вас. Я отредактирую и добавлю пример. - person Dan; 14.05.2012