2

60,000 枚の画像を含むトレーニング データセットと 10,000 枚の画像を含むテスト データセットがあります。各画像は 0 から 9 までの整数を表します。私の目標は、サポート ベクター マシンのライブラリである libsvm を使用して、トレーニング データセットから数値を学習し、生成された分類を使用してテスト データセットの画像を予測することでした。

各画像は、ピクセルまたは機能28x28を持っていることを意味します。機能が多すぎるように見えますが、SVM アプリケーションを実行してトレーニング データセットを学習するのに 5 ~ 10 分しかかかりませんでした。テスト結果は非常に良好でした。78493% success rate

機能の量を減らすと同時に、あまり多くの情報を失わないようにするために、matlab の PCA を試してみることにしました。

[coeff scores latent] = princomp(train_images,'econ');

潜在機能を少しいじってみたところ、最初の 90 個の機能は結果として10%情報が失われることがわかったので、最初の 90 個のみを使用することにしました。

上記のコードで train_images はサイズの配列です[60000x784]

このコードからスコアを取得し、スコアから必要な機能の数を単純に取得したため、最終的にトレーニング画像の配列が得られました[60000x90]

質問 1: テスト データセットを係数 => coeff に射影する正しい方法は何ですか?

私は以下を使用してみました:

test_images = test_images' * coeff;

したがって、test_images はサイズの配列で[784x10000]あり、coeffはサイズの配列であることに注意してください。[784x784]

それから、次のようにして 90 個の機能だけを取り出しました。

test_images = test_images(:,(1:number_of_features))';

これは正しかったようです。ただし、トレーニングと予測を実行した後、60% success ratePCA をまったく使用しなかった場合よりもはるかに低い成功率が得られました。

質問 2: なぜこんなに低い結果が得られたのですか?

PCAの後、いつものようにデータをスケーリングしましたが、これは正しいことだと思います。libsvm Web サイトによると、スケーリングしないことは一般的には良い考えではないため、ここでは問題ではないと思います。

前もって感謝します

4

1 に答える 1

1

あなたの最初の質問に関して、私はMarkVがすでにあなたに答えを提供したと思います。2番目の質問について:PCAは確かにデータの分散の大部分を保存しますが、必ずしもデータの情報の90%を維持することを意味するわけではありません。場合によっては、分類を成功させるために必要な情報が、実際にノックオフしたこれらの10%にあることがあります。この良い例はここにあります。特に図1があります。

それで、あなたが完全な機能で素晴らしい結果を得るならば、なぜ寸法を減らすのですか?

さまざまな主成分を試してみることをお勧めします。コンポーネント91:180を使用するとどうなりますか?それは面白い実験かもしれません...

于 2012-12-15T20:34:23.367 に答える