2012-05-09 32 views
1

Matlabでデータ行列Xの主成分を見つけるには、最適化問題min || X-XBB '||を使います。ここでノルムはフロベニウスのノルムで、 Bは正規直交行列である。もし誰かが私にそのことを教えることができるのだろうかと思っています。理想的には、最適化ツールボックスを使用してこれを行うことができます。私は他の方法を使って主成分を見つける方法を知っています。私の目標は、行列を答えとして持つ最適化問題の設定と解決方法を理解することです。私は非常に提案やコメントを感謝したいと思います。Matlabで最適化を使用してPCAを実行する

ありがとうございます! MJ

答えて

2

最適化についての事を解決するためのさまざまな方法があるということですそのうちのいくつかは広範な計算を必要とする可能性がある問題である。

あなたの解は、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 

したがって、これらのメソッドを使用する場合、注意が必要、との良好な出発点

+0

ありがとう@Rasman。私は問題の私の定式化にやや鈍感だった。未知数は行列Bであり、制約B'B = Iであり、最小化される関数はf(B)= || X-X * B * B '||である。したがって、実際には非線形制約を持つ制約付き最適化です。私はそれがMatlabでどのように設定されるのだろうかと思っています。また、最小化ルーチンのドキュメントを見ると、行列の応答については何も触れられませんでした。それについて私が読むのに最適な場所はどこですか?もう一度ありがとう! – user765195

+0

@ user765195 ok、fminconを使用する必要があります。私はそれを反映するために投稿を編集します。 – Rasman

2

統計ツールボックスには、PCAを組み込む組み込み関数 'princomp'があります。 PCAを行う独自のコードを作成する方法(一般的に、最適化ツールボックスなしで)を学びたい場合は、this siteが良いリソースです。

Optimization Toolboxを使用して最適化の問題として設定することについて特に言及しているので、スタンフォード大学のCVXという非常に信頼性の高いサードパーティ製のパッケージがあります。 at this siteを参照しています。

+0

を選択しようとあなたが@kitchenetteありがとうございます。これは非常に有用な情報です。私の質問で言及したように、私はPCAを見つけるためのプリンコンと他の標準的な方法にはかなり精通しています。実際、私の質問はMatlabの特定の種類の最適化問題を設定して解決する方法と同じくらいPCAに関するものではありません。パッケージCVXは非常に有望に見えますが、私はどちらかといえばローテクか、最適化ツールボックスの中で何かを望んでいました。 – user765195

1

最適化ツールボックスはありますか?ドキュメントは本当に良いです。例の1つを試してみてください: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×3行列Mを最適化しようとしているとします。目的関数を定義しました。峠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 
+0

ありがとう@ダンあなたの応答です。私は最適化されるべきマトリックスへの参照を文書のどこにも見つけることができません。それは常にベクトルまたはスカラーです。それについての良い参考資料はどこにありますか?再度、感謝します! – user765195

+0

おそらく、行列をベクトルに変形して目的関数に渡し、それを目的関数内の行列に再構成するだけです。それはあなたのために働くはずです。私は例を編集して追加します。 – Dan

関連する問題