📄 fpica.m
字号:
Xsub=X(:, getSamples(numSamples, sampleSize));
B = (Xsub * (( Xsub' * B) .^ 3)) / size(Xsub,2) - 3 * B;
case 13
% Optimoitu
Ysub=X(:, getSamples(numSamples, sampleSize))' * B;
Gpow3 = Ysub .^ 3;
Beta = sum(Ysub .* Gpow3);
D = diag(1 ./ (Beta - 3 * size(Ysub', 2)));
B = B + myy * B * (Ysub' * Gpow3 - diag(Beta)) * D;
% tanh
case 20
hypTan = tanh(a1 * X' * B);
B = X * hypTan / numSamples - ...
ones(size(B,1),1) * sum(1 - hypTan .^ 2) .* B / numSamples * ...
a1;
case 21
% optimoitu - epsilonin kokoisia
Y = X' * B;
hypTan = tanh(a1 * Y);
Beta = sum(Y .* hypTan);
D = diag(1 ./ (Beta - a1 * sum(1 - hypTan .^ 2)));
B = B + myy * B * (Y' * hypTan - diag(Beta)) * D;
case 22
Xsub=X(:, getSamples(numSamples, sampleSize));
hypTan = tanh(a1 * Xsub' * B);
B = Xsub * hypTan / size(Xsub, 2) - ...
ones(size(B,1),1) * sum(1 - hypTan .^ 2) .* B / size(Xsub, 2) * a1;
case 23
% Optimoitu
Y = X(:, getSamples(numSamples, sampleSize))' * B;
hypTan = tanh(a1 * Y);
Beta = sum(Y .* hypTan);
D = diag(1 ./ (Beta - a1 * sum(1 - hypTan .^ 2)));
B = B + myy * B * (Y' * hypTan - diag(Beta)) * D;
% gauss
case 30
U = X' * B;
Usquared=U .^ 2;
ex = exp(-a2 * Usquared / 2);
gauss = U .* ex;
dGauss = (1 - a2 * Usquared) .*ex;
B = X * gauss / numSamples - ...
ones(size(B,1),1) * sum(dGauss)...
.* B / numSamples ;
case 31
% optimoitu
Y = X' * B;
ex = exp(-a2 * (Y .^ 2) / 2);
gauss = Y .* ex;
Beta = sum(Y .* gauss);
D = diag(1 ./ (Beta - sum((1 - a2 * (Y .^ 2)) .* ex)));
B = B + myy * B * (Y' * gauss - diag(Beta)) * D;
case 32
Xsub=X(:, getSamples(numSamples, sampleSize));
U = Xsub' * B;
Usquared=U .^ 2;
ex = exp(-a2 * Usquared / 2);
gauss = U .* ex;
dGauss = (1 - a2 * Usquared) .*ex;
B = Xsub * gauss / size(Xsub,2) - ...
ones(size(B,1),1) * sum(dGauss)...
.* B / size(Xsub,2) ;
case 33
% Optimoitu
Y = X(:, getSamples(numSamples, sampleSize))' * B;
ex = exp(-a2 * (Y .^ 2) / 2);
gauss = Y .* ex;
Beta = sum(Y .* gauss);
D = diag(1 ./ (Beta - sum((1 - a2 * (Y .^ 2)) .* ex)));
B = B + myy * B * (Y' * gauss - diag(Beta)) * D;
% skew
case 40
B = (X * ((X' * B) .^ 2)) / numSamples;
case 41
% Optimoitu
Y = X' * B;
Gskew = Y .^ 2;
Beta = sum(Y .* Gskew);
D = diag(1 ./ (Beta));
B = B + myy * B * (Y' * Gskew - diag(Beta)) * D;
case 42
Xsub=X(:, getSamples(numSamples, sampleSize));
B = (Xsub * ((Xsub' * B) .^ 2)) / size(Xsub,2);
case 43
% Uusi optimoitu
Y = X(:, getSamples(numSamples, sampleSize))' * B;
Gskew = Y .^ 2;
Beta = sum(Y .* Gskew);
D = diag(1 ./ (Beta));
B = B + myy * B * (Y' * Gskew - diag(Beta)) * D;
otherwise
error('Code for desired nonlinearity not found!');
end
end
% Calculate ICA filters.
W = B' * whiteningMatrix;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Also plot the last one...
switch usedDisplay
case 1
% There was and may still be other displaymodes...
% 1D signals
icaplot('dispsig',(X'*B)');
drawnow;
case 2
% ... and now there are :-)
% 1D basis
icaplot('dispsig',A');
drawnow;
case 3
% ... and now there are :-)
% 1D filters
icaplot('dispsig',W);
drawnow;
otherwise
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DEFLATION APPROACH
if approachMode == 2
B = zeros(vectorSize);
% The search for a basis vector is repeated numOfIC times.
round = 1;
numFailures = 0;
while round <= numOfIC,
myy = myyOrig;
usedNlinearity = gOrig;
stroke = 0;
notFine = 1;
long = 0;
endFinetuning = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Show the progress...
if b_verbose, fprintf('IC %d ', round); end
% Take a random initial vector of lenght 1 and orthogonalize it
% with respect to the other vectors.
if initialStateMode == 0
w = rand(vectorSize, 1) - .5;
elseif initialStateMode == 1
w=whiteningMatrix*guess(:,round);
end
w = w - B * B' * w;
w = w / norm(w);
wOld = zeros(size(w));
wOld2 = zeros(size(w));
% This is the actual fixed-point iteration loop.
% for i = 1 : maxNumIterations + 1
i = 1;
gabba = 1;
while i <= maxNumIterations + gabba
drawnow;
if (interruptible & g_FastICA_interrupt)
if b_verbose
fprintf('\n\nCalculation interrupted by the user\n');
end
return;
end
% Project the vector into the space orthogonal to the space
% spanned by the earlier found basis vectors. Note that we can do
% the projection with matrix B, since the zero entries do not
% contribute to the projection.
w = w - B * B' * w;
w = w / norm(w);
if notFine
if i == maxNumIterations + 1
if b_verbose
fprintf('\nComponent number %d did not converge in %d iterations.\n', round, maxNumIterations);
end
round = round - 1;
numFailures = numFailures + 1;
if numFailures > failureLimit
if b_verbose
fprintf('Too many failures to converge (%d). Giving up.\n', numFailures);
end
if round == 0
A=[];
W=[];
end
return;
end
% numFailures > failurelimit
break;
end
% i == maxNumIterations + 1
else
% if notFine
if i >= endFinetuning
wOld = w; % So the algorithm will stop on the next test...
end
end
% if notFine
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Show the progress...
if b_verbose, fprintf('.'); end;
% Test for termination condition. Note that the algorithm has
% converged if the direction of w and wOld is the same, this
% is why we test the two cases.
if norm(w - wOld) < epsilon | norm(w + wOld) < epsilon
if finetuningEnabled & notFine
if b_verbose, fprintf('Initial convergence, fine-tuning: '); end;
notFine = 0;
gabba = maxFinetune;
wOld = zeros(size(w));
wOld2 = zeros(size(w));
usedNlinearity = gFine;
myy = myyK * myyOrig;
endFinetuning = maxFinetune + i;
else
numFailures = 0;
% Save the vector
B(:, round) = w;
% Calculate the de-whitened vector.
A(:,round) = dewhiteningMatrix * w;
% Calculate ICA filter.
W(round,:) = w' * whiteningMatrix;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Show the progress...
if b_verbose, fprintf('computed ( %d steps ) \n', i); end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Also plot the current state...
switch usedDisplay
case 1
if rem(round, displayInterval) == 0,
% There was and may still be other displaymodes...
% 1D signals
temp = X'*B;
icaplot('dispsig',temp(:,1:numOfIC)');
drawnow;
end
case 2
if rem(round, displayInterval) == 0,
% ... and now there are :-)
% 1D basis
icaplot('dispsig',A');
drawnow;
end
case 3
if rem(round, displayInterval) == 0,
% ... and now there are :-)
% 1D filters
icaplot('dispsig',W);
drawnow;
end
end
% switch usedDisplay
break; % IC ready - next...
end
%if finetuningEnabled & notFine
elseif stabilizationEnabled
if (~stroke) & (norm(w - wOld2) < epsilon | norm(w + wOld2) < ...
epsilon)
stroke = myy;
if b_verbose, fprintf('Stroke!'); end;
myy = .5*myy;
if mod(usedNlinearity,2) == 0
usedNlinearity = usedNlinearity + 1;
end
elseif stroke
myy = stroke;
stroke = 0;
if (myy == 1) & (mod(usedNlinearity,2) ~= 0)
usedNlinearity = usedNlinearity - 1;
end
elseif (notFine) & (~long) & (i > maxNumIterations / 2)
if b_verbose, fprintf('Taking long (reducing step size) '); end;
long = 1;
myy = .5*myy;
if mod(usedNlinearity,2) == 0
usedNlinearity = usedNlinearity + 1;
end
end
end
wOld2 = wOld;
wOld = w;
switch usedNlinearity
% pow3
case 10
w = (X * ((X' * w) .^ 3)) / numSamples - 3 * w;
case 11
EXGpow3 = (X * ((X' * w) .^ 3)) / numSamples;
Beta = w' * EXGpow3;
w = w - myy * (EXGpow3 - Beta * w) / (3 - Beta);
case 12
Xsub=X(:,getSamples(numSamples, sampleSize));
w = (Xsub * ((Xsub' * w) .^ 3)) / size(Xsub, 2) - 3 * w;
case 13
Xsub=X(:,getSamples(numSamples, sampleSize));
EXGpow3 = (Xsub * ((Xsub' * w) .^ 3)) / size(Xsub, 2);
Beta = w' * EXGpow3;
w = w - myy * (EXGpow3 - Beta * w) / (3 - Beta);
% tanh
case 20
hypTan = tanh(a1 * X' * w);
w = (X * hypTan - a1 * sum(1 - hypTan .^ 2)' * w) / numSamples;
case 21
hypTan = tanh(a1 * X' * w);
Beta = w' * X * hypTan;
w = w - myy * ((X * hypTan - Beta * w) / ...
(a1 * sum((1-hypTan .^2)') - Beta));
case 22
Xsub=X(:,getSamples(numSamples, sampleSize));
hypTan = tanh(a1 * Xsub' * w);
w = (Xsub * hypTan - a1 * sum(1 - hypTan .^ 2)' * w) / size(Xsub, 2);
case 23
Xsub=X(:,getSamples(numSamples, sampleSize));
hypTan = tanh(a1 * Xsub' * w);
Beta = w' * Xsub * hypTan;
w = w - myy * ((Xsub * hypTan - Beta * w) / ...
(a1 * sum((1-hypTan .^2)') - Beta));
% gauss
case 30
% This has been split for performance reasons.
u = X' * w;
u2=u.^2;
ex=exp(-a2 * u2/2);
gauss = u.*ex;
dGauss = (1 - a2 * u2) .*ex;
w = (X * gauss - sum(dGauss)' * w) / numSamples;
case 31
u = X' * w;
u2=u.^2;
ex=exp(-a2 * u2/2);
gauss = u.*ex;
dGauss = (1 - a2 * u2) .*ex;
Beta = w' * X * gauss;
w = w - myy * ((X * gauss - Beta * w) / ...
(sum(dGauss)' - Beta));
case 32
Xsub=X(:,getSamples(numSamples, sampleSize));
u = Xsub' * w;
u2=u.^2;
ex=exp(-a2 * u2/2);
gauss = u.*ex;
dGauss = (1 - a2 * u2) .*ex;
w = (Xsub * gauss - sum(dGauss)' * w) / size(Xsub, 2);
case 33
Xsub=X(:,getSamples(numSamples, sampleSize));
u = Xsub' * w;
u2=u.^2;
ex=exp(-a2 * u2/2);
gauss = u.*ex;
dGauss = (1 - a2 * u2) .*ex;
Beta = w' * Xsub * gauss;
w = w - myy * ((Xsub * gauss - Beta * w) / ...
(sum(dGauss)' - Beta));
% skew
case 40
w = (X * ((X' * w) .^ 2)) / numSamples;
case 41
EXGskew = (X * ((X' * w) .^ 2)) / numSamples;
Beta = w' * EXGskew;
w = w - myy * (EXGskew - Beta*w)/(-Beta);
case 42
Xsub=X(:,getSamples(numSamples, sampleSize));
w = (Xub * ((Xub' * w) .^ 2)) / size(Xsub, 2);
case 43
Xsub=X(:,getSamples(numSamples, sampleSize));
EXGskew = (Xsub * ((Xsub' * w) .^ 2)) / size(Xsub, 2);
Beta = w' * EXGskew;
w = w - myy * (EXGskew - Beta*w)/(-Beta);
otherwise
error('Code for desired nonlinearity not found!');
end
% Normalize the new w.
w = w / norm(w);
i = i + 1;
end
round = round + 1;
end
if b_verbose, fprintf('Done.\n'); end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Also plot the ones that may not have been plotted.
if (usedDisplay > 0) & (rem(round-1, displayInterval) ~= 0)
switch usedDisplay
case 1
% There was and may still be other displaymodes...
% 1D signals
temp = X'*B;
icaplot('dispsig',temp(:,1:numOfIC)');
drawnow;
case 2
% ... and now there are :-)
% 1D basis
icaplot('dispsig',A');
drawnow;
case 3
% ... and now there are :-)
% 1D filters
icaplot('dispsig',W);
drawnow;
otherwise
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% In the end let's check the data for some security
if ~isreal(A)
if b_verbose, fprintf('Warning: removing the imaginary part from the result.\n'); end
A = real(A);
W = real(W);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Subfunction
% Calculates tanh simplier and faster than Matlab tanh.
function y=tanh(x)
y = 1 - 2 ./ (exp(2 * x) + 1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Samples = getSamples(max, percentage)
Samples = find(rand(1, max) < percentage);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -