1

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

ありがとう!MJ

4

3 に答える 3

2

Statistics ツールボックスには、PCA を実行する組み込み関数 ' princomp ' があります。PCA を実行するための独自のコードを作成する方法を (通常は最適化ツールボックスなしで) 学びたい場合は、このサイトが優れたリソースです。

Optimization Toolbox を使用してこれを最適化問題として設定したいと具体的に述べたので、参照している最適化問題を解決できる、スタンフォード大学の CVX として知られる非常に信頼できるサードパーティ パッケージありますこのサイト

于 2012-05-09T03:10:46.237 に答える
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

したがって、これらの方法を使用するときは注意して、適切な出発点を選択してください

于 2012-05-09T16:26:30.420 に答える
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() は自分で作成する必要があります。最適化する Matrix を入力として取り、現在の入力 Matrix のコストを示すスカラー値を出力する必要があります。ほとんどのオプティマイザは、このコストを最小限に抑えようとします。コストはスカラーでなければならないことに注意してください。

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
于 2012-05-09T06:32:07.080 に答える