2

m*n 次元の行列Mがあります。Mには n 個のデータが含まれ、それぞれが m 次元であり、m は n よりも非常に大きいです。

ここで私の質問は、どのように計算するか、OpenCVでSVDを使用してMのPCAを見つけ、総負荷またはエネルギーの99%を含む固有ベクトルのみを保持する手順または手順は何ですか?

4

2 に答える 2

4

まず、データ行列 M から共分散行列 C を計算する必要があります。OpenCV のcalcCovarMatrix関数を使用するか、単純に C = (M - mu)' x (M - mu) を計算できます。ここで、データ サンプルは行として格納されていると仮定しました。 M では、mu はデータ サンプルの平均であり、A' は転置された行列 A です。

次に、C に対して SVD を実行して USU' = SVD(C) を取得します。ここで、U' は転置された U です。この場合、SVD からの V' は U' と同じです。これは、C が対称で正定値 (C がフル ランクの場合) または半正定値である場合 (C がフル ランクの場合) であるためです。U には C の固有ベクトルが含まれます。

あなたがしたいことは、k個の固有ベクトル、つまりk個の列(または行?固有ベクトルを行または列として返すかどうかOpenCVドキュメントを確認する必要があります)を保持することです。行列Sの対応する特異値はに対応しますk 個の最大特異値とその合計をすべての特異値の合計で割った値は、>= 0.99 です。基本的に、ここでの特異値は、特徴ベクトルの対応する各特徴の分散に対応し、0.99、つまり分散/エネルギーの 99% を保持する上位 k を保持します。

Uk などの行列にまとめられたこれらの固有ベクトルは、PCA ベースです。これらの固有ベクトルもたまたま互いに直交しているため、Uk の転置、Uk' が射影行列です。新しいテスト サンプル x の次元削減されたポイントを取得するには、単純に x_reduced = Uk'*(x - mu) を計算します。

于 2013-04-18T08:26:47.750 に答える
2

一般に、PCA (つまり、OpenCV に固有ではない) の場合、共分散行列から始めます。したがって、あなたの場合、入力はm*m元のサンプルの成分ごとの分散によって形成された正方行列になります。

次に、(非常に大きな)正方対称行列で固有ベクトル分解を行い、必要な最上位の固有ベクトルを抽出できます。対応する固有値を使用して、パーセンテージ バリアンス カバレッジを決定します。

元の変数のスケールが似ていない場合 (つまり、データを正規化していない場合) は、共分散行列の代わりに相関行列を使用できます。

OpenCV を使用した PCA については、Google が非常に役立つ例をいくつか提供しています。

于 2013-04-18T06:12:39.817 に答える