⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpica.m

📁 利用fastica数据包对给定的两幅混合图象利用独立成分分析进行分离。
💻 M
📖 第 1 页 / 共 2 页
字号:
      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  endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFLATION APPROACHif 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      if (usedDisplay > 0)	drawnow;      end      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 = (Xsub * ((Xsub' * 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  endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In the end let's check the data for some securityif ~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 + -