PDA

Prikaži potpunu verziju : FastICA Octave Implementacija


clzola
26.1.2016, 2:04
Pokušavam da implementiram FastICA algoritam prateći članak na vikipediji: FastICA Wiki Source (https://en.wikipedia.org/wiki/FastICA)
Ali bez mnogo uspjeha.

Jezik Octave

Evo koda:

function W = FastICA(X, C)
# Centering data
mx = mean(X);
X = X - repmat(mx, size(X,1), 1);

# Whitening data
c = X*X';
[E, D, V] = svd(c); #Singular Value Decomposition
D = sqrt(D);
X = E * D * E' * X;

# vars
[N, M] = size(X);
W = zeros(C, N);
i = ones(M, 1);

# FastICA
for p = [1:1:C]
w = randn(N, 1);

while( norm(w - W(p,:)', 2) > 0.00001 )
W(p,:) = w;

u = w' * X;
w = 1 / M * X * g(u)' - 1 / M * dg(u) * i * w;

s = zeros(N, 1);
for j = [1:1:p-1]
s += W(j,:)' * w' * W(j,:)';
endfor;

w = w - s;
w = w / norm(w, 2);
endwhile
endfor;
endfunction;


I evo kako pozovem ovo čudo od funkcije:


source1 = [1; 2; 3; 4; 5; 6]
source2 = [2; 5; 7; 8; 12; 8];
mix1 = 0.5 * source1 + 0.5 * source2;
mix2 = 0.3 * source1 + 0.9 * source2;
mix = [ mix1, mix2 ];
W = FastICA(mix, 2);


Matrica W je dimenzija CxN medjutim W' * mix daje gresku o nepoklapanju dimenzija, dok W*mix radi i daje mi 2x2 matricu... Zar ne bih trebao da dobijem source1 i source2 kao rezultat množenja matrice W i matrice mix. Doduše ja nisam ni siguran koliko sam ja ovo tačno implementirao... Ako ima neko ko poznaje ovu materiju pa da sugeriše/ispravi moj kod bio bih mu veoma zahvalan :)
Ono što me takođe brine je ovo "izbjeljivanje" podataka. Nisam baš siguran da radi - ne kapiram baš kako treba da se iplementira... a i da budem iskren pogubio sam se sa dimenzijama, više ni ne znam šta je koje dimenzije xD