www.pudn.com > ica_demo.rar > icacovb.m


%[z,W,w] = icacovb(x,tol,wb);
%x	input data stream
%tol	tolerance on stopping (dw/w)
%wb	'y' - shows waitbar
%z	output set
%W	mixing matrix with time
%w	mixing matrix (final)

function [z,W,w] = icacovb(x,tol,wb)

if size(x,1) > size(x,2)
  error('x should be in D,N format');
end;

[DIM,N] = size(x);

w = eye(DIM);

if (wb=='y')
  waitbar(0,'Covariant ICA - B');
end;

%%x = normalis(x,x);	% zero mean unit variance
eta = 0.2/max(eig(cov(x')))
change = 1;
n = 1;

while (change > tol)
  a = (w*x);
  z = -tanh(a);
  xp = w*a;
  dw = eta*(w + xp*z'/N);
  w = w + dw;
  change = mean(mean(abs(dw)./abs(w)));
  if (max(abs(w))>1e10)
	disp('blow out, rescaling learning rate');
	w = eye(DIM);
	eta = eta/2
	change = 1;
  end;
  W(n,:) = reshape(w,1,DIM*DIM);
  if (wb == 'y')
    waitbar(tol/change);
  end;
  n = n+1;
end;

a = w*x;
z = -tanh(a);
z = z';

if (wb=='y'),close;end;	% the waitbar
return;