0
私はMatlabで非常に基本的なeigenface計算を実装しようとしています。それは動作しますが、意味のある固有値は2つしかありません。残りはゼロです。対応する固有ベクトルは正しいと思われるが、そのほとんどは画像に変換するときに固有顔を示すからである。Matlab固有空間の実装で、非常に多くの固有値が0になるのはなぜですか?
なぜ私の固有値の大部分はゼロですか?固有値をその重要度(最大の大きさの固有値)でソートするために、それらをゼロとは異なるものにする必要があります。
私は彼らがここで見つけることができる400枚の画像、ワット各サイズH /を読ん= 92分の112ピクセル ています:http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
コードを:
clear all;
files = dir('eigenfaces2/training/*.pgm');
[numFaces, discard] = size(files);
h = 112;
w = 92;
s = h * w;
%calculate average face
avgFace = zeros(s, 1);
faces = [];
for i=1:numFaces
file = strcat('eigenfaces2/training/', files(i).name);
im = double(imread(file));
im = reshape(im, s, 1);
avgFace = avgFace + im;
faces(:,i) = im;
end
avgFace = avgFace ./ numFaces;
A = [];
for i=1:numFaces
diff = avgFace - faces(i);
A(:,i) = diff;
end
numEigs = 20;
L = (A' * A)/numFaces;
[tmpEigs, discard] = eigs(L, numEigs);
eigenfaces = [];
for i=1:numEigs
v = tmpEigs(:,i);
eigenfaces(:,i) = A * v;
end
%visualize largest eigenfaces
figure;
for i=1:numEigs
eigface = eigenfaces(:,i);
mmax = max(eigface);
mmin = min(eigface);
eigface = 255 .* (eigface-mmin) ./ (mmax-mmin);
eigface = reshape(eigface, h, w);
subplot(4,5,i); imshow(uint8(eigface));
end
素晴らしい!それは問題を解決しました - それらのMATLABインデックスは私を怒らせる運転しています - ありがとう:) –