hist_ic.m.svn-base
来自「bayesian network structrue learning mat」· SVN-BASE 代码 · 共 270 行
SVN-BASE
270 行
function [n,edges,nbedges,xechan] = hist_ic(x,crit)%HIST_IC optimal Histogram based on IC information criterion%% [N,EDGES,NBEDGES,XECHAN] = HIST-IC(X,CRIT) % bins the elements of X into an optimal number of bins according% to a cost function based on Akaike's Criterion.%%% CRIT = 1 | 2 | 3 (choose one of the 3 possible criterium) (default 3)% 4 (returns the initial histogram instead of the optimal one) %%% N = cell array containing the distribution of each column of X% (or a vector if X is a column vector)% EDGES = cell array containing the bin edges of each column of X% (or a vector if X is a column vector)% NBEDGES = vector containing the number of bin edges for each column of X% (or a number if X is a column vector)% XECHAN = discretized version of X%% Ref : O. Colot et al., Information Criteria and Abrupt Changes in% Probability Laws, Signal Processing VII: Theory and Applications% pp.1855-18858, September 1994%% F. El-Matouat, O. Colot 2000 (first version)% Revised 01-06-2001 by Ph. Leray%%%% Things to do :% * Call criteron by a name ('aic','xxx', ...) instead of a number%if nargin == 0 error('Requires one or two arguments.')endif nargin == 1 crit = 3;end;if min(size(x))==1, x = x(:); endif isstr(x) error('Input argument must be numeric.')endif isempty(x), error('No elements to count')end[nb_l,nb_c]=size(x);% Outputs declarationxechan=zeros(nb_l,nb_c);edges=cell(nb_c,1);% Local variablesmaxi = max(x);mini = min(x);%% Erreur ? ancien code :%% nb_clas_ini=2*round(sqrt(nb_l)-1); % article Fatimanb_clas_ini=round(2*sqrt(nb_l)-1); pas_ini=(maxi-mini)/nb_clas_ini; % initial stepfor j=1:nb_c, % optimal histogram for each column of X histo_ini =hist(x(:,j),nb_clas_ini); % initial histogram if (crit~=4) [hist_opt,pas_opt]=hist1_ic(histo_ini,nb_l,pas_ini(j),nb_clas_ini,crit); else fprintf('Histo initial\n'); hist_opt=histo_ini; pas_opt=ones(1,nb_clas_ini)*pas_ini(j); end; nbedges(j)=size(hist_opt,2); edges{j}=mini(j)+cumsum(pas_opt(1:nbedges(j)-1)); %+1e-7; [n{j} xechan(:,j)]=histc(x(:,j),[-inf edges{j} inf]); n{j}=n{j}(1:end-1);endif (nb_c==1) n=n{1}; edges=edges{1};end% ============================== subfunctionsfunction [hist_opt,step_opt]=hist1_ic(histo,nb,step_ini,m,critere);%HIST1_IC optimal Histogram based on IC information criterion%% [HIST_OPT, STEP_OPT] = HIST1_IC(HISTO, NB, STEP_INI, NBSTEP_INI, CRIT) % fusion of an 1D histogramme (HISTO) according to an IC criterion (CRIT)%% This function is mainly an internal function used by HIST_IC%% Ref : O. Colot et al., Information Criteria and Abrupt Changes in% Probability Laws, Signal Processing VII: Theory and Applications% pp.1855-18858, September 1994%% F. El-Matouat, O. Colot 2000 (first version)% Revised 11-06-2001 by Ph. Leray%%% Things to do :% * Call criteron by a name ('aic','xxx', ...) instead of a number%aic=[];aic2=[]; % Initialisationhistt=histo;teta = histt/nb;pas = step_ini*ones(1,m);% Calcul de l'ensemble des histogrammes optimauxfor z=1:m % Calcul de AIC pour l'union entre hist(indice,u) et hist(indice,u+1) aic2 = [aic2 cal_aic(nb,teta,pas,m+1-z,critere)]; if (z~=m) % Calcul des couples de classes adjacentes if critere==1 penalite=(2*(m-z)-1)/nb; elseif critere==2 penalite=(m-z-1)*(1+log(nb))/nb; else penalite=(m-z)*(1+log(log(nb)))/nb; end aic=cla_adj(nb,teta,pas,step_ini,m-z+1,histt,penalite,aic); % Recherche de la valeur min du crit閞e pour les classes adjacentes [min_aic classe]=min(aic(1:(m-z))); % Fusion de hist(classe) et hist(classe+1) nb_pas1=pas(classe)/step_ini; nb_pas2=pas(classe+1)/step_ini; ess=round( nb_pas1*histt(classe)+nb_pas2*histt(classe+1) ); teta(classe)=ess / nb; histt(classe)=ess / (nb_pas1+nb_pas2); pas(classe)=pas(classe)+pas(classe+1); % Cr閍tion du nouvel histogramme itemp = setdiff(1:m+1-z,classe+1); histt = histt(itemp); pas = pas(itemp); teta = teta(itemp); endend% Recherche du crit閞e minimun AIC[min_AIC fusion]=min(aic2(1:m));% Initialisation de histohistt=histo;teta = histt/nb;pas = step_ini*ones(1,m);% Calcul de l'histogramme optimal for z=1:fusion-1 % Calcul des couples de classes adjacentes if critere==1 penalite=(2*(m-1)-1)/nb; elseif critere==2 penalite=(m-2)*(1+log(nb))/nb; else penalite=(m-1)*(1+log(log(nb)))/nb; end aic=cla_adj(nb,teta,pas,step_ini,m,histt,penalite,aic); % Recherche de la valeur min du crit閞e pour les classes adjacentes [min_aic classe]=min(aic(1:m-1)); % Fusion de hist(indice,classe) et hist(indice,classe+1) nb_pas1=pas(classe)/step_ini; nb_pas2=pas(classe+1)/step_ini; teta(classe)=(round(nb_pas1*histt(classe)+nb_pas2*histt(classe+1)))/nb; histt(classe)=(nb_pas1*histt(classe)+nb_pas2*histt(classe+1))/(nb_pas1+nb_pas2); pas(classe)=pas(classe)+pas(classe+1); % Cr閍tion du nouvel histogramme itemp=setdiff(1:m,classe+1); histt = histt(itemp); pas = pas(itemp); teta = teta(itemp); %aic=zeros(1,m-1); m=m-1;endhist_opt=histt;step_opt=pas;%=====================================================% Calcul du Critere pour l'ensemble des classesfunction akaike=cal_aic(size_ech,teta,pas,m,critere);if critere==1 a=(2*m-1)/size_ech;elseif critere==2 a=(m-1)*(1+log(size_ech))/size_ech;else a=m*(1+log(log(size_ech)))/size_ech;endindu = find(teta);akaike = a - 2*sum(teta(indu).*log(teta(indu)./pas(indu)));%=====================================================% Cla_adj.m% aic=cla_adj(taille,indice,teta,pas,pas_ini,m,hist,penalite,aic)% taille=nombre d'閘閙ents dans chacune des hypotheses; % indice=numero de la classe;% Calcul du critere de Akaike pour l'histogramme totale avec % fusion de deux classes adjacentes u et (u+1).function aic=cla_adj(size_ech,teta,pas,pas_ini,m,hist,penalite,aic);for u=1:m-1 cumul=0; % This loop is faster than a sum of a vectorised computation ! for x=1:m if x~=u & x~=u+1 & teta(x)~=0 cumul=cumul+teta(x)*log(teta(x)/pas(x)); end end nb_pas1=pas(u)/pas_ini; nb_pas2=pas(u+1)/pas_ini; b=( round(nb_pas1*hist(u)+nb_pas2*hist(u+1) ) ) / size_ech; if b~=0 c=2*b*log( b / ( pas(u) + pas(u+1) ) ); else c=0; end aic(u)=penalite-2*cumul-c; end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?