私は、(超音波で)ラットの鳴き声のさまざまな特性に関するデータを含むマトリックスを取得したいと考えています。変数には、開始周波数、終了周波数、持続時間などが含まれます。観察には、音声録音のすべてのラットの鳴き声が含まれます。
PCA を使用してデータを分析し、できればこれらの呼び出しの構造とその動作にとって重要ではない主成分を非相関化し、呼び出しをグループ化できるようにしたいと考えています。
私の問題は、PCA がどのように機能するかについての基本的な理解がある一方で、Matlab でこれを実装する方法を含む細かい点を理解していないことです。
私のデータを標準化する必要があることはわかっています。私が見たすべての方法には、平均を差し引いて調整する手段が含まれます。ただし、標準偏差で割ったり、平均調整データの転置を N-1 (N は変数の数) の平方根で割ったりするものもあります。
標準化されたデータを使用すると、共分散行列を見つけて、eig(cov(...)) を使用するなどして固有値とベクトルを抽出できます。代わりに svd(...) を使用するものもあります。これが何なのか、なぜ重要なのか、いまだに理解できません
PCA を実装するにはさまざまな方法があることは知っていますが、すべての方法で異なる結果が得られるのは好きではありません。
pca(...) コマンドもあります。
データを再構築する際に、データを主成分データで調整する手段を乗算する人もいれば、主成分データの転置を使用して同じことを行う人もいます。
主成分とデータのグラフをプロットして、データを分析できるようにしたいだけです (最も重要でない主成分は削除されています)。これらの固有ベクトルの分散と、それらがデータの合計分散をどの程度表しているかを知りたいです。PCA によって得られるすべての情報を完全に活用できるようにしたい
誰でも助けることができますか?
================================================== =======
このコードは、 http://people.maths.ox.ac.uk/richardsonm/SignalProcPCA.pdfの pg 20 に基づいて動作するようです。
X = [105 103 103 66; 245 227 242 267; 685 803 750 586;...
147 160 122 93; 193 235 184 209; 156 175 147 139;...
720 874 566 1033; 253 265 171 143; 488 570 418 355;...
198 203 220 187; 360 365 337 334; 1102 1137 957 674;...
1472 1582 1462 1494; 57 73 53 47; 1374 1256 1572 1506;...
375 475 458 135; 54 64 62 41];
[M,N] = size(X);
mn = mean(X,2);
data = X - repmat(mn,1,N);
Y = data' / sqrt(N-1);
[~,S,PC] = svd(Y);
S = diag(S);
V = S .* S;
signals = PC' * data;
%plotting single PC1 on its own
figure;
plot(signals(1,:),zeros(1,size(signals,2)),'b.','markersize',15)
xlabel('PC1')
title('plotting single PC1 on its own')
%plotting PC1 against PC2
figure;
plot(signals(1,:),signals(2,:),'b.','markersize',15)
xlabel('PC1'),ylabel('PC2')
title('plotting PC1 against PC2')
figure;
plot(PC(:,1),PC(:,2),'m.','markersize',15)
xlabel('effect(PC1)'),ylabel('effect(PC2)')
しかし、標準偏差はどこにありますか? 結果はどのように異なりますか
B=zscore(X);
[PC, D] = eig(cov(B));
D = diag(D);
cumsum(flipud(D)) / sum(D)
PC*B %(note how this says PC whereas above it says PC')
主成分が列として表されている場合、最小の固有値を見つけ、それに対応する固有ベクトルの列をゼロの列に設定することで、最も重要でない固有ベクトルを削除できます。
上記の方法のいずれかを pca(...) コマンドを使用して適用し、同じ結果を得るにはどうすればよいですか? 誰かが私にこれを説明するのを手伝ってもらえますか (理想的には、これらすべてがどのように同じ結果を達成できるかを教えてください)?