4

私は10枚の画像(18x18)を持っています。これらの画像をという名前の配列内に保存しますimages[324][10]。ここで、数値324は画像のピクセル数を表し、数値10は私が持っている画像の合計量を表します。

これらの画像をニューロンネットワークに使用したいのですが、324は入力として与える大きな数であるため、この数を減らして、できるだけ多くの情報を保持したいと思います。

princompこれは、 PCAを実装する関数で実行できると聞きました。

問題は、特に私の場合、この関数の使用方法の例が見つからないことです。

私が走ったら

[COEFF, SCORE, latent] = princomp(images);

正常に動作しますが、どうすれば配列を取得できnewimages[number_of_desired_features][10]ますか?

4

1 に答える 1

5

ここでは、PCA が正しい選択になる可能性があります (ただし、唯一の選択肢ではありません)。ただし、PCA は入力データの特徴の数を自動的に減らすわけではないことに注意してください。このチュートリアルを読むことをお勧めします: http://arxiv.org/pdf/1404.1100v1.pdf - これは、私が PCA を理解するために使用したものであり、初心者には非常に適しています。

質問に戻ります。画像は 324 次元空間のベクトルです。この空間では、最初の基本ベクトルは左上隅に白いピクセルがあり、次の基本ベクトルは次のピクセルが白、その他はすべて黒などです。おそらく、この画像データを表現するのに最適な基本ベクトル セットではありません。PCA は、新しい基本ベクトル (COEFF 行列 - 古いベクトル空間で値として表される新しいベクトル) と新しいイメージ ベクトル値 (SCORE 行列) を計算します。その時点で、データはまったく失われていません (フィーチャー番号の削減はありません)。ただし、新しい基底ベクトルの一部は、データ自体ではなくノイズに関連している可能性があるため、使用を中止することができます。それはすべてチュートリアルで詳細に説明されています。

images = rand(10,324);
[COEFF, SCORE] = princomp(images);
reconstructed_images = SCORE / COEFF + repmat(mean(images,1), 10, 1);
images - reconstructed_images
%as you see there are almost only zeros - the non-zero values are effects of small numerical errors
%its possible because you are only switching between the sets of base vectors used to represent the data
for i=100:324
    SCORE(:,i) = zeros(10,1);
end
%we remove the features 100 to 324, leaving only first 99
%obviously, you could take only the non-zero part of the matrix and use it
%somewhere else, like for your neural network
reconstructed_images_with_reduced_features = SCORE / COEFF + repmat(mean(images,1), 10, 1);
images - reconstructed_images_with_reduced_features
%there are less features, but reconstruction is still pretty good
于 2012-11-20T22:23:55.000 に答える