📄 mfbox_kernelica.m
字号:
function [comp,psi]=mfbox_kernelica(source,ics,method)% Copyright by Peter Gruber % Signal Processing & Information Theory group% Institute of Biophysics, University of Regensburg, Germany% Homepage: http://research.fabian.theis.name% http://www-aglang.uni-regensburg.de%% This file is free software, subject to the % GNU GENERAL PUBLIC LICENSE, see gpl.txterror(nargchk(1,3,nargin)) % check no. of input argsdim = size(source,1);if (nargin<2), ics = dim; endif (nargin<3), method = 'geneticgausspearson'; endmethod = lower(method);switch method case 'geneticgausspearson' borderBase = [2.6,4]; borderSlope = [0,1]; maxNumIterations = 100; epsilon = 0.001; [optcols,target,kernelmat] = basisopt(source,10*ics,ics,100*ics,'gauss'); optcols = optcols(size(optcols,1),:); psi = projection(source,optcols,kernelmat,'gauss'); comp = mfbox_fasticapearson(psi',epsilon,maxNumIterations,borderBase, ... borderSlope,ics,1,dim,'off'); case 'geneticpolypearson' borderBase = [2.6,4]; borderSlope = [0,1]; maxNumIterations = 100; epsilon = 0.001; [optcols,target,kernelmat] = basisopt(source,10*ics,ics,100*ics,'poly',1,5); optcols = optcols(size(optcols,1),:); psi = projection(source,optcols,kernelmat,'poly',1,5); comp = mfbox_fasticapearson(psi',epsilon,maxNumIterations,borderBase, ... borderSlope,ics,1,dim,'off'); case 'geneticgaussjade' [optcols,target,kernelmat] = basisopt(source,10*ics,ics,100*ics,'gauss'); optcols = optcols(size(optcols,1),:); psi = projection(source,optcols,kernelmat,'gauss'); [A,comp] = mfbox_jade(psi',ics); otherwise [A,comp] = mfbox_jade(source',ics);endreturnfunction [optcols,target,kernel_opt]=basisopt(X,ind_num,ind_size,maxgen,kernel,c,d,verbose)if (nargin<6), c = 1; endif (nargin<7), d = 1; endif (nargin<8), verbose = 0; endggap = 0.9;if (verbose>0), warning('Number of individuals %d, Generation Gap: %f',ind_num,ggap); end[rows_X,cols_X] = size(X);chrom = initpop(ind_num, ind_size, cols_X);ObjV = condobj(X,chrom,kernel,c,d);if (verbose>0), warning('Minimale Konditionszahl des Ausgangchromosomensatzes: %f',min(ObjV)); endgen = 0;target = zeros(1,maxgen);optcols = zeros(maxgen,size(chrom,2));while (gen<maxgen) fitnv = ranking(ObjV); SelCh = select('sus',chrom,fitnv,ggap); SelCh = sort(SelCh,2); SelCh = recombin('xovsp',SelCh,0.7); SelCh = mut(SelCh,0.1,(cols_X+1)*ones(1,ind_size)); [rows_SelCh,cols_SelCh] = size(SelCh); SelCh = SelCh+(SelCh==zeros(rows_SelCh,cols_SelCh).*round(cols_X*rand(rows_SelCh,cols_SelCh))); ObjVSel = condobj(X,SelCh,kernel,c,d); [chrom,ObjV] = reins(chrom,SelCh,1,1,ObjV,ObjVSel); gen = gen+1; [target(gen),index] = min(ObjV); optcols(gen,:) = chrom(index,:); if (verbose>0), warning('current generation %d',gen); endend[ObjV,kernel_opt] = condobj(X,optcols(gen,:),kernel,c,d);if (verbose>1), plot(target); endfunction psi=projection(X,basis,kernelm,kernel,c,d)if (nargin<5), c = 1; endif (nargin<6), d = 1; end[rows_X,cols_X] = size(X);[rows_basis,dim_basis] = size(basis);kbasis = X(:,basis);if (strcmp(kernel,'poly')) Xvdot = (kbasis'*X+c).^d; psi = kernelm^(-1/2)*Xvdot;endif (strcmp(kernel,'gauss')) Xvdot = []; for k = 1:dim_basis D = kbasis(:,k)*ones(1,cols_X); B = D-X; B = B.*B; diflength = sum(B,1); Xvdot = cat(1,Xvdot,-diflength/c); end Xvdot = exp(Xvdot); psi = kernelm^(-1/2)*Xvdot;endfunction chrom=initpop(ind_num,ind_size,max_value)chrom = zeros(ind_num,ind_size);for k = 1:ind_num permutation = (randperm(max_value)); chrom(k,:) = permutation(1:ind_size);endchrom = sort(chrom,2);function [Condnumbers,kernel_opt]=condobj(X,chrom,kernel,c,d)[rows_chrom,cols_chrom] = size(chrom);Condnumbers = zeros(rows_chrom,1);if (strcmp(kernel,'poly')) cond_min = inf; for k = 1:rows_chrom sel_matrix = X(:,chrom(k,:)); kernel_matrix = ((sel_matrix'*sel_matrix)+c).^d; Condnumbers(k) = cond(kernel_matrix); if (Condnumbers(k)<cond_min) cond_min = Condnumbers(k); kernel_opt = kernel_matrix; end endendif (strcmp(kernel,'gauss')) cond_min = inf; for k = 1:rows_chrom sel_matrix = X(:,chrom(k,:)); EXPONENT = []; for l = 1:cols_chrom; d = sel_matrix(:,l); D = d*ones(1,cols_chrom); B = sel_matrix-D; B = B.*B; diflength = (sum(B,1))'; EXPONENT = cat(2,EXPONENT,-diflength/c); end kernel_matrix = exp(EXPONENT); Condnumbers(k) = cond(kernel_matrix); if (Condnumbers(k)<cond_min) cond_min = Condnumbers(k,1); kernel_opt = kernel_matrix; end endendfunction [chrom,objvch]=reins(chrom,SelCh,subpop,InsOpt,objvch,ObjVSel)NindP = size(chrom,1);NindO = size(SelCh,1);if (nargin == 2), subpop = 1; endif (nargin > 2), if isempty(subpop), subpop = 1; elseif isnan(subpop), subpop = 1; endendNind = NindP/subpop;Nsel = NindO/subpop;Isobjvch = 0; IsObjVSel = 0;if (nargin>4), Isobjvch = 1;endif (nargin<4), insr = 1.0; sel = 0; endif (nargin>=4), if (isempty(InsOpt)), insr = 1.0; sel = 0; elseif (isnan(InsOpt)), insr = 1.0; sel = 0; else insr = NaN; sel = NaN; if (length(InsOpt) >= 1), sel = InsOpt(1); end if (length(InsOpt) >= 2), insr = InsOpt(2); end if (isnan(sel)), sel = 0; end if (isnan(insr)), insr =1.0; end endendif (insr==0), return; endNIns = min(max(floor(insr*Nsel+.5),1),Nind);for irun=1:subpop, if (sel==1) [dummy,ChIx] = sort(-objvch((irun-1)*Nind+1:irun*Nind)); else [dummy,ChIx] = sort(rand(Nind,1)); end PopIx = ChIx((1:NIns)')+ (irun-1)*Nind; if (NIns<Nsel) [dummy,OffIx] = sort(ObjVSel((irun-1)*Nsel+1:irun*Nsel)); else OffIx = (1:NIns)'; end SelIx = OffIx((1:NIns)')+(irun-1)*Nsel; chrom(PopIx,:) = SelCh(SelIx,:); if (Isobjvch == 1 && IsObjVSel == 1), objvch(PopIx) = ObjVSel(SelIx); endendfunction newchrom=mut(oldchrom,Pm,baseV)[Nind,Lind] = size(oldchrom);if (nargin<2), Pm = 0.7/Lind; endif (isnan(Pm)), Pm = 0.7/Lind; endif (nargin<3), baseV = crtbase(Lind); endif (isnan(baseV)), baseV = crtbase(Lind); endif (isempty(baseV)), baseV = crtbase(Lind); endbaseM = baseV(ones(Nind,1),:) ;newchrom = rem(oldchrom+(rand(Nind,Lind)<Pm).*ceil(rand(Nind,Lind).*(baseM-1)),baseM);function newchrom=recombin(REC_F,chrom,RecOpt,subpop)Nind = size(chrom,1);if (nargin<4), subpop = 1; endif (nargin>3), if isempty(subpop), subpop = 1; elseif isnan(subpop), subpop = 1; endendNind = Nind/subpop;if (nargin<3), RecOpt = 0.7; endif (nargin>2), if (isempty(RecOpt)), RecOpt = 0.7; elseif (isnan(RecOpt)), RecOpt = 0.7; endendnewchrom = cell(1,subpop);for irun = 1:subpop, chromSub = chrom((irun-1)*Nind+1:irun*Nind,:); newchromSub = feval(REC_F,chromSub,RecOpt); newchrom{irun} = newchromSub;endnewchrom = cat(1,newchrom{:});function fitnv=ranking(ObjV,RFun,subpop)Nind = size(ObjV,1);if (nargin<2), RFun = []; endif (nargin>1), if isnan(RFun), RFun = []; end, endif (numel(RFun) == 2) if (RFun(2) == 1), NonLin = 1; elseif (RFun(2) == 0), NonLin = 0; end RFun = RFun(1); if (isnan(RFun)), RFun = 2; endendif (nargin<3), subpop = 1; endif (nargin>2) if isempty(subpop), subpop = 1; elseif isnan(subpop), subpop = 1; endendNind = Nind/subpop;if (isempty(RFun)) RFun = 2*(0:Nind-1)'/(Nind-1);elseif (numel(RFun) == 1) if NonLin == 1, Root1 = roots([RFun(1)-Nind,(RFun(1)*ones(1,Nind-1))]); RFun = (abs(Root1(1)) * ones(Nind,1)) .^ (0:Nind-1)'; RFun = RFun / sum(RFun) * Nind; else RFun = 2-RFun + 2*(RFun-1)*[0:Nind-1]'/(Nind-1); endend;fitnv = [];for irun = 1:subpop, ObjVSub = ObjV((irun-1)*Nind+1:irun*Nind); NaNix = isnan(ObjVSub); Validix = find(~NaNix); [ans,ix] = sort(-ObjVSub(Validix)); ix = [find(NaNix);Validix(ix)]; Sorted = ObjVSub(ix); i = 1; fitnvSub = zeros(Nind,1); for j = [find(Sorted(1:Nind-1)~=Sorted(2:Nind));Nind]', fitnvSub(i:j) = sum(RFun(i:j)) * ones(j-i+1,1) / (j-i+1); i =j+1; end [ans,uix] = sort(ix); fitnvSub = fitnvSub(uix); fitnv = [fitnv;fitnvSub];endfunction SelCh=select(sel_F,chrom,fitnv,ggap,subpop)NindCh = size(chrom,1);if (nargin<5), subpop = 1; endif (nargin>4), if isempty(subpop), subpop = 1; elseif isnan(subpop), subpop = 1; endendNind = NindCh/subpop;if (nargin<4), ggap = 1; endif (nargin>3), if isempty(ggap), ggap = 1; elseif isnan(ggap), ggap = 1; endendNSel = max(floor(Nind*ggap+.5),2);SelCh = zeros(subpop,size(chrom,2));for irun = 1:subpop, fitnvSub = fitnv((irun-1)*Nind+1:irun*Nind); ChrIx = feval(sel_F,fitnvSub,NSel)+(irun-1)*Nind; SelCh(irun,:) = chrom(ChrIx,:);endfunction basevec=crtbase(Lind,base)[ml,LenL] = size(Lind);if (nargin<2) base = 2*ones(LenL,1);endmb = size(base,1);if (~ (ml>1 || mb>1)) && (~ ((LenL>1 && LenB>1 && LenL~=LenB) || ... (LenL==1 && LenB>1 ))) && (LenB==1 && LenL>1) base = base*ones(LenL,1);endbasevec = [];for i = 1:LenL basevec = [basevec,base(i)*ones(Lind(i),1)'];endfunction newchrom=xovsp(oldchrom,xovr)newchrom = xovmp(oldchrom,xovr,1,0);function NewChrIx=sus(fitnv,Nsel)[Nind,ans] = size(fitnv);cumfit = cumsum(fitnv);trials = cumfit(Nind)/Nsel*(rand+(0:Nsel-1)');Mf = cumfit(:,ones(1,Nsel));Mt = trials(:,ones(1,Nind))';[NewChrIx,ans] = find(Mt<Mf & [zeros(1,Nsel);Mf(1:Nind-1,:)]<=Mt);[ans,shuf] = sort(rand(Nsel, 1));NewChrIx = NewChrIx(shuf);function newchrom=xovmp(oldchrom,Px,Npt,Rs)[Nind,Lind] = size(oldchrom);if (Lind<2), newchrom = oldchrom; return; endif (nargin<4), Rs = 0; endif (nargin<3), Npt = 0; Rs = 0; endif (nargin<2), Px = 0.7; Npt = 0; Rs = 0; endif (isnan(Px)), Px = 0.7; endif (isnan(Npt)), Npt = 0; endif (isnan(Rs)), Rs = 0; endif (isempty(Px)), Px = 0.7; endif (isempty(Npt)), Npt = 0; endif (isempty(Rs)), Rs = 0; endXops = floor(Nind/2);DoCross = rand(Xops,1)<Px;odd = 1:2:Nind-1;even = 2:2:Nind;Mask = ~Rs|(oldchrom(odd,:)~=oldchrom(even,:));Mask = cumsum(Mask,2);xsites(:,1) = Mask(:,Lind);if (Npt>=2) xsites(:,1) = ceil(xsites(:,1).*rand(Xops,1));endxsites(:,2) = rem(xsites+ceil((Mask(:,Lind)-1).*rand(Xops,1)).*DoCross-1,Mask(:,Lind))+1;Mask = (xsites(:,ones(1,Lind))<Mask) == ... (xsites(:,2*ones(1,Lind))<Mask);if (~Npt) shuff = rand(Lind,Xops); [ans,shuff] = sort(shuff); for i = 1:Xops oldchrom(odd(i),:) = oldchrom(odd(i),shuff(:,i)); oldchrom(even(i),:) = oldchrom(even(i),shuff(:,i)); endendnewchrom(odd,:) = (oldchrom(odd,:).* Mask)+(oldchrom(even,:).*(~Mask));newchrom(even,:) = (oldchrom(odd,:).*(~Mask))+(oldchrom(even,:).*Mask);if (rem(Nind,2)) newchrom(Nind,:) = oldchrom(Nind,:);endif (~Npt) [ans,unshuff] = sort(shuff); for i = 1:Xops newchrom(odd(i),:) = newchrom(odd(i),unshuff(:,i)); newchrom(even(i),:) = newchrom(even(i),unshuff(:,i)); endend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -