% András példája PCA-ra egy valódi EEG adatsoron

clear all;
% close all;

% Töltsük be a példa adatsort:
load([cd '\data\MxKicsi.mat']); % Kiki írja be magának az elérési utat.

% Ez egy EEGLab formátumú struktúra. Az eeg a .data mez?ben van.
% Kicsomagoljuk az y-ba és transzponáljuk:

y = EEG.data';

N = size(y, 1);
Nchannels = size(y,2);

% Az átlagok levonásával megkapjuk a centralizált vektorokat:
ymean = mean(y);    % minden oszlop átlaga
ycent = y - repmat(ymean, [N 1]);

% Mutassuk meg az adatsort:
figure; hold on
chstep = -100;
for ii = (1 : Nchannels)
    plot(ycent(:, ii) + ii*chstep);
end
set(gca, 'YTick', sort([1:Nchannels]*chstep), 'YTickLabel', (Nchannels:-1:1));
axis tight;
title('64 channel EEG data series'); xlabel('Sample number'); ylabel('Channel number');

% Ehhez a méréssorozathoz tartozó kovariancia mátix:
VY = (ycent' * ycent) / (N-1);
% NB: Matlabban ugyanezt így is lehet:
% VY = cov(ycent);

% Mutassuk meg színkódolva:
figure;
imagesc(VY); colormap('jet'); colorbar;
axis equal; axis tight;
title('Covariance matrix'); xlabel('Channel'); ylabel('Channel');

% A spektrális felbontása ennek a mátrixnak a következ?:
[U,D] = eig(VY);

% D átlójában vannak a sajátértékek növekv? sorrendben.
% U oszlopaiban vannak az egyes sajátértékekhez tartozó sajátvektorok.

% Vegyük ki a sajátértékeket:
DD = sort(sum(D), 'descend');

% Mutassuk meg ?ket:
figure
plot(DD, 'r.-');
axis tight
title('Principal component eigenvalues'); xlabel('Principal component'), ylabel('Eigenvalue');

% Számoljuk ki az egyes f?komponensek jelmeneteit:
for ii = (1 : Nchannels)
    ypc(:, ii) = ycent * U(:,end-ii+1);
end

% Mutassuk meg ?ket:
figure; hold on
chstep = -100;
for ii = (1 : Nchannels)
    plot(ypc(:, ii) + ii*chstep);
end
set(gca, 'YTick', sort([1:Nchannels]*chstep), 'YTickLabel', (Nchannels:-1:1));
axis tight;
title('Principal components of 64 channel EEG data series'); xlabel('Sample number'); ylabel('Principal component number');

% The end.