📄 denoise_delayedcoordinates.m
字号:
function [sig,rk,components] = denoise_delayedcoordinates(noisesig,k,clustermethod,reducemethod,choosemethod,sortmethod,gamma,verbose);%delocalize - denoises delayed data%% [sig,rk,components] = denoise_delayedcoordinates(noisesig,k,clustermethod,reducemethod,choosemethod,sortmethod,gamma,verbose);%% clustermethod - kmeans|seq (default=kmeans)% reducemethod - pca|ica (default=pca)% choosemethod = mdl|mdlk|err (default=mdl)% sortmethod = var|kurt (default=var)%% k - max number of partitions% gamma - (default=1)% (gamma<0) - number of dimensions to use% (gamma>0)% (choosemethod=mdl) - mdlgamma% (choosemethod=err) - portion of signal to discard (0 none, 1 all)% verbose - 0 no messages, 20 all messages (default=0)% % sig - denoised signal% rk - list with number of chosen components% components - list of the components%% 01.06.03 - initial version% Peter Grubererror(nargchk(2,8,nargin)) % check no. of input args[m,samples]=size(noisesig);if (nargin<3) clustermethod='kmeans'; endif (nargin<4) reducemethod='pca'; endif (nargin<5) choosemethod='mdl'; endif (nargin<6) sortmethod='kurt'; endif (nargin<7) gamma=1; endif (nargin<8) verbose=0; end[noisesig,meanvalues]=remmean(noisesig);[localsig,parts,permut]=localize(noisesig,k,m,clustermethod);if (verbose>8) plot(localsig'); title('delayed signal'); pause; endncomp=size(parts,1);if (verbose>1) warning(sprintf('clusterd into %d parts',ncomp)); endrk=zeros(1,ncomp);if (nargout>2) orglocalsig=localsig; endfor i=1:ncomp [lsig,lmean]=remmean(localsig(:,parts(i,1):parts(i,2))); [V,W,D]=sortcomponents(lsig,reducemethod,sortmethod,verbose); p=choosenumberofcomponents(V*lsig,D,choosemethod,gamma,verbose); r=size(V,1); if (verbose>1) warning(sprintf('Reduction Step (%d/%d/%d)',p,r,m)); end R=eye(r); R(:,p+1:r)=0; if (verbose>5) scplot(V*lsig,R*V*lsig); title('reduced Signal'); pause; end rk(i)=p; if (verbose>10) scplot(lsig); title('local delayed Signal'); pause; end if (nargout>2) for j=1:r tempR=eye(r); tempR(j,j)=0; tempdelayedsig=orglocalsig; tempdelayedsig(:,parts(i,1):parts(i,2))=W*tempR*V*(lsig+lmean*ones(1,size(lsig,2))); tempdelayedsig=orglocalsig-tempdelayedsig; components{(i-1)*m+j}=delocalize(tempdelayedsig,permut); end end lsig=W*R*V*lsig; if (verbose>10) scplot(lsig); title('denoised delayed Signal'); pause; end localsig(:,parts(i,1):parts(i,2))=lsig+lmean*ones(1,size(lsig,2)); if (verbose>8) plot(delocalize(localsig,permut)'); title('denoised Signal'); pause; endendsig=delocalize(localsig,permut)+meanvalues*ones(1,samples);returnfunction [V,W,D] = sortcomponents(signal,reducemethod,ratingmethod,verbose);%sortcomponents - find the components%% [V,W,D] = sortcomponents(signal,reducemethod,ratingmathod,verbose); %% reducemethod = pca|{min,max,comb,auto,var}{rca,ica} (default=pca)%% 01.08.03 - initial version% 01.11.04 - rewrite% Peter Grubererror(nargchk(1,4,nargin)) % check no. of input args[m,samples]=size(signal);if (nargin<2) reducemethod='pca'; endif (nargin<3) ratingmethod='var'; endif (nargin<4) verbose=0; endswitch reducemethod case 'pca' [W,D]=eig(cov(signal')); V=W'; ksignal=V*signal; case 'mpencil' [W,D]=eig(cov(signal')); E=D;E(E>0)=1./sqrt(E(E>0)); V=W*E*W'; c=max(10,ceil(samples/1000)); c=exp(-[-c:1:c].^2)/sqrt(2*pi); [P,Q]=eig(cov(matconv(V*signal,c)')); E=D;E(E>0)=sqrt(E(E>0)); W=W*E*W'*P; W=W./(ones(m,1)*sqrt(sum(W.^2))); W=ort(W); V=W^-1; ksignal=V*signal; case 'fastica' ni=max(100,size(signal,2)/10); if (verbose > 2) [ksignal,W,V]=fastica(signal,'approach','symm','verbose','on','g','tanh','maxNumIterations',ni,'stabilization','on'); else [ksignal,W,V]=fastica(signal,'approach','symm','verbose','off','g','tanh','maxNumIterations',ni,'stabilization','on'); end W=W./(ones(m,1)*sqrt(sum(W.^2))); W=ort(W); V=W^-1; ksignal=V*signal; case 'pearsonica' [ksignal,W,V]=pearson_ica(signal); W=W./(ones(m,1)*sqrt(sum(W.^2))); W=ort(W); V=W^-1; ksignal=V*signal; case 'jadeica' [W,ksignal]=jade(signal); W=W./(ones(m,1)*sqrt(sum(W.^2))); W=ort(W); V=W^-1; ksignal=V*signal; case 'mdlica' [E,D]=eig(cov(signal')); D=sum(D,1); D=D(m:-1:1); E=E(:,m:-1:1); p=mdl(D,samples,1); ksignal=E'*signal; if (p==1) ksignal=ksignal(1,:); V=1; W=1; else [ksignal,W,V]=pearson_ica(ksignal(1:p,:)); end V=[V,zeros(p,m-p)]*E'; W=E*[W;zeros(p,m-p)]; W=W./(ones(m,1)*sqrt(sum(W.^2))); V=W^-1; ksignal=V*signal;endk=size(ksignal,1);R=eye(k);R=R(k:-1:1,:);switch ratingmethod case 'kurt' [dummy,kp]=sort(kurtosis(ksignal').^2); [dummy2,kp]=sort(kp); case 'maxkurt' [dummy,kp]=sort(-kurtosis(ksignal')); [dummy2,kp]=sort(kp); case 'minkurt' [dummy,kp]=sort(kurtosis(ksignal')); [dummy2,kp]=sort(kp); case 'comb' [dummy,kp]=sort((var(ksignal').*kurtosis(ksignal')).^2); [dummy2,kp]=sort(kp); case 'auto' [dummy,kp]=sort(var(autocor(ksignal'))); [dummy2,kp]=sort(kp); otherwise [dummy,kp]=sort(var(ksignal')); [dummy2,kp]=sort(kp);endif (verbose>2) plot(dummy); title(['Sortcriterion: ',ratingmethod]); pause; endR=R(:,kp);V=R*V;W=W*R';% the rows contain eigenvalues of the covariances of the% signal and the estimated noiseswitch reducemethod case 'pca' D=diag(var((R*ksignal)')); D=ones(m,1)*diag(D)'; otherwise T=W; C=cov((R*ksignal)'); D(1,:)=diag(C)'; for i=1:m S=ort(V(i+1:m,:)); S=ort(S(m-i+1:m,:)); d=S*T*C*T'*S'; D(i,1:i)=eig(d(1:i,1:i))'; D(i,i+1:m)=eig(d(i+1:m,i+1:m))'; endendreturnfunction N=matconv(M,C)[d,m]=size(M);c=length(C);N=zeros(d,m+c-1);for i=1:size(M,1) N(i,:)=conv(M(i,:),C(:));endreturnendfunctionfunction [localdata,parts,permutation] = localize(sig,k,m,method);%localize - generate localized data%% [localdata,parts,permutation] = localize(sig,k,m,method);%% method - {kmeans,seq}%% 1.8.03% Peter Grubererror(nargchk(2,4,nargin)) % check no. of input argsif (nargin<3) m=0; endif (nargin<4) method='kmeans'; end[dim,samples]=size(sig);if (k==1) localdata=sig; parts=[1,samples]; permutation=[1:samples]; return; endif (m>samples) m=samples; endswitch method case 'kmeans'; [cent,cl]=kmeans_cluster('batch',sig',k);cent=cent'; case 'fast'; [cent,cl]=cluster_fast(sig,k,max(500,ceil(samples/500))); case 'seq'; [cent,cl]=cluster(sig,k); case 'diadic'; [cent,cl]=cluster_diadic(sig,k); case 'simple'; [cent,cl]=cluster(sig,k,0);endp=zeros(size(cent,2),1); for i=1:size(cent,2) p(i)=sum(cl==i); endwhile ((min(p)<m) || (sum(isfinite(p))>k)) [i,im]=min(p); q=zeros(size(cent,2),1); for i=1:size(cent,2) if (isfinite(p(i))) q(i)=dist(cent(:,im),cent(:,i)); else q(i)=+Inf; end end [i,j]=sort(q); cl=cl+(cl==j(1))*(j(2)-j(1)); p(j(2))=p(j(2))+p(j(1)); p(j(1))=+Inf;endk=sum(isfinite(p));pt=zeros(k,3);[i,j]=sort(p);pt(:,3)=cumsum(i(1:k));pt(:,1)=j(1:k);pt(1,2)=1; pt(2:k,2)=pt(1:k-1,3)+1;i=zeros(samples,1);for j=1:k i=i+(cl==pt(j,1))*(j-pt(j,1)); endcl=cl+i; clear ilocaldata=zeros(dim,samples);permutation=zeros(samples,1);nn=[1:samples];for i=1:k localdata(:,pt(i,2):pt(i,3))=sig(:,cl==i); permutation(pt(i,2):pt(i,3))=nn(cl==i);endparts=pt(:,2:3);returnfunction sig = delocalize(localsig,permutation);%delocalize - regenerate localized data%% sig = delocalize(localsig,permutation);%% 1.6.03% Peter Grubererror(nargchk(2,2,nargin)) % check no. of input args[dummy,p]=sort(permutation);sig=localsig(:,p);returnfunction [centroids,clusters,err] = cluster(D, n, epochs, verbose);% cluster - find clusters%% [centroids,clusters,err] = cluster(D, n, epochs, verbose)%% 1.6.03% Peter Grubererror(nargchk(2,4,nargin)) % check no. of input argsif (nargin<3) epochs=100; endif (nargin<4) verbose=0; end[dim,samples] = size(D);if (n==1) centroids=sum(D,2)/samples; clusters=ones(samples,1); err=sum(sqrt(sum((D-centroids*ones(1,samples)).^2,1)))/samples; returnendpartition=zeros(1,n+1); centers=zeros(1,n);for i=2:n partition(i)=floor(samples/n)*(i-1); endpartition(n+1)=samples;for t=1:epochs oldpart=partition; for i=1:n centers(i)=partition(i)+ceil((partition(i+1)-partition(i))/2); end for i=1:n-1 num=centers(i+1)-centers(i)+1; if (num==2) partition(i+1)=centers(i); else dists=zeros(1,num); for j=1:num-1 dists(j+1)=dists(j)+sqrt(sum((D(:,centers(i)+j-1)-D(:,centers(i)+j)).^2)); end partition(i+1)=centers(i)+sum(dists<(dists(num)/2)); end end if all(partition==oldpart) break; endendcentroids=zeros(dim,n); clusters=zeros(samples,1); err=0;for i=2:n+1 s=partition(i-1)+1; e=partition(i); n=e-s+1; centroids(:,i-1)=sum(D(:,s:e),2)/n; clusters(s:e)=ones(1,n)*(i-1); err=err+sum(sqrt(sum((D(:,s:e)-centroids(:,i-1)*ones(1,n)).^2,1)));enderr=err/samples;returnfunction [centroids,clusters,err] = cluster_diadic(D, n, verbose);% cluster_diadic - find clusters%% [centroids,clusters,err] = cluster(D, n, verbose)%% 1.10.03% Peter Grubererror(nargchk(2,3,nargin)) % check no. of input argsif (nargin<3) verbose=0; end[dim,samples] = size(D);if (n==1) centroids=sum(D,2)/samples; clusters=ones(samples,1); err=sum(sqrt(sum((D-centroids*ones(1,samples)).^2,1)))/samples; returnendclusters=ones(samples,1);m=1; while ((2^m<n) && (m<dim)) m=m+1; endDm = D - sum(D,2) * ones (1,samples) / samples;[E,C]=eig(cov(Dm'));C=ones(1,dim)*C;Dm=E'*Dm;[s,p]=sort(C);for j=1:m d=Dm(p(j),:); clusters(d>0)=clusters(d>0)+2^(j-1);endcentroids=zeros(dim,2^m); err=0;for i=1:2^m if (sum(clusters==i)==0) centroids(:,i)=zeros(dim,1); else centroids(:,i)=sum(D(:,clusters==i),2)/sum(clusters==i); err=err+sum(sqrt(sum((D(:,clusters==i)-centroids(:,i)*ones(1,sum(clusters==i))).^2,1))); endenderr=err/samples;returnfunction [centroids,clusters,err] = cluster_fast(D, n, numkmeans, verbose);% cluster_fast - find clusters%% [centroids,clusters,err] = cluster(D, n, numkmeans, verbose)%% 1.10.03% Peter Grubererror(nargchk(2,4,nargin)) % check no. of input argsif (nargin<3) numkmeans=500; endif (nargin<4) verbose=0; end[dim,samples] = size(D);numkmeans=max(numkmeans,n);sig=randperm(samples);sig=D(:,sig);sig=sig(:,1:numkmeans);[centroids,cl]=kmeans_cluster('batch',sig',n);centroids=centroids';distcl=ones(1,samples)*Inf;clusters=zeros(samples,1);for i=1:size(centroids,2) d=sum((D-centroids(:,i)*ones(1,samples)).^2,1); t=d-distcl; clusters(t<0)=i; distcl=min(d,distcl);enderr=0;for i=1:size(centroids,2) d=D(:,clusters==i); err=err+sum(sqrt(sum((d-centroids(:,i)*ones(1,size(d,2))).^2,1)));enderr=err/samples;return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -