2012-05-30 17 views
5

私は人間の行動認識に使用する分類子(ガウス混合モデル)を書く必要があります。 私はビデオの4つのデータセットを持っています。トレーニングセットとして3つ、テストセットとして1つを選択します。 gmモデルをトレーニングセットに適用する前に、そのモデルにpcaを実行します。主成分分析

pca_coeff=princomp(trainig_data); 
score = training_data * pca_coeff; 
training_data = score(:,1:min(size(score,2),numDimension)); 

どうすればよいですか?私は、テストデータ

new_pca_coeff=princomp(testing_data); 
score = testing_data * new_pca_coeff; 
testing_data = score(:,1:min(size(score,2),numDimension)); 

または私はトレーニングデータのための計算pca_coeffを使用する必要があります上に新しいprincompを実行すべきか?

score = testing_data * pca_coeff; 
testing_data = score(:,1:min(size(score,2),numDimension)); 

答えて

7

分類子は、トレーニングデータの主成分によって定義された空間内のデータに対して訓練されています。別の空間で評価するのは意味がありません。したがって、データをトレーニングするのと同じ変換をテストデータに適用する必要があります。異なるpca_coefを計算しないでください。

偶然、テストデータがトレーニングデータと同じ分布から独立して描かれている場合は、十分に大きなトレーニングとテストセットの場合、主成分はほぼ同じでなければなりません。

使用する主成分の数を選択する1つの方法は、PCA分解から固有値を調べることです。あなたはこのようなprincomp関数からこれらを取得することができます。

​​

eigenvalues変数は、各要素は、対応する主成分で占め分散の量を記述する配列となります。そうした場合:しかし、あなたの1月、http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif

plot(eigenvalues); 

あなたが最初の固有値が最大になることを確認する必要があり、彼らは急速に減少します(これは、「スクリープロット」と呼ばれ、次のようになります。 12の代わりに800点まで)。

小さい対応する固有値を持つ主成分は、これらの次元のデータの分散が非常に小さいため、有用である可能性は低いです。多くの人々がしきい値を選択し、固有値がそのしきい値を超えるすべての主要なコンポーネントを選択します。しきい値を選ぶ非公式の方法は、Screeプロットを見て、ラインのレベルのすぐ後にスレッシュホールドを選択することです。以前にリンクした画像では、良い値は〜0.8で、3つまたは4つの主成分。 「低次元データによって記述分散の割合」を算出する

proportion_of_variance = sum(eigenvalues(1:k)) ./ sum(eigenvalues); 

IIRC、あなたのような何かを行うことができます。

ただし、分類タスクに主成分を使用しているため、特定の数のPCが最適であることを確かめることはできません。フィーチャの分散は、それが分類にどれほど有益であるかについては何も教えてくれません。 ScreeプロットでPCを選択する代わりに、さまざまな数の主成分を使って分類し、最良の数が経験的に何であるかを調べるだけです。

+0

ありがとうRichante、あなたの答えは明確で有用です。私は別の疑問を抱いている。使用するコンポーネントはいくつありますか?各観測について、私は800個の特徴を計算し、これらは元のデータの次元です。 numDimensionの最良の選択は何ですか?私が使うことができる式があるのか​​、それとも実験結果によってそれを選ぶべきですか? –

+0

私は元の答えにいくつかの情報を加えて、主成分の数を選ぶ方法を説明しました。簡単な答えは、実際には良い公式はありません。実験で選ぶのはおそらく大丈夫です。 – Richante

+0

最後のコード 'proportion_of_variance = ...'について、Matlab docsは 'proportion_of_variance = cumsum(eigenvalues)。/ sum(eigenvalues)'と計算し、その 'k'変数の必要性を緩和します。ベクトルを使用して、しきい値に達した場所を見つけるための検索を実行できます。 – Unapiedra

関連する問題