60,000 枚の画像を含むトレーニング データセットと 10,000 枚の画像を含むテスト データセットがあります。各画像は 0 から 9 までの整数を表します。私の目標は、サポート ベクター マシンのライブラリである libsvm を使用して、トレーニング データセットから数値を学習し、生成された分類を使用してテスト データセットの画像を予測することでした。
各画像は、ピクセルまたは機能28x28
を持っていることを意味します。機能が多すぎるように見えますが、SVM アプリケーションを実行してトレーニング データセットを学習するのに 5 ~ 10 分しかかかりませんでした。テスト結果は非常に良好でした。784
93% 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 rate
PCA をまったく使用しなかった場合よりもはるかに低い成功率が得られました。
質問 2: なぜこんなに低い結果が得られたのですか?
PCAの後、いつものようにデータをスケーリングしましたが、これは正しいことだと思います。libsvm Web サイトによると、スケーリングしないことは一般的には良い考えではないため、ここでは問題ではないと思います。
前もって感謝します