about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/SLP/misc/hist_ic.m
diff options
context:
space:
mode:
Diffstat (limited to 'sourcecodes/bnt-master/SLP/misc/hist_ic.m')
-rw-r--r--sourcecodes/bnt-master/SLP/misc/hist_ic.m268
1 files changed, 268 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/SLP/misc/hist_ic.m b/sourcecodes/bnt-master/SLP/misc/hist_ic.m
new file mode 100644
index 00000000..b16980fd
--- /dev/null
+++ b/sourcecodes/bnt-master/SLP/misc/hist_ic.m
@@ -0,0 +1,268 @@
+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 - philippe.leray@univ-nantes.fr
+%
+%
+%   Things to do :
+%	* Call criteron by a name ('aic','xxx', ...) instead of a number
+%
+
+
+if nargin == 0
+    error('Requires one or two arguments.')
+end
+
+if nargin == 1
+    crit = 3;
+end;
+
+if min(size(x))==1, x = x(:); end
+
+if isstr(x)
+    error('Input argument must be numeric.')
+end
+
+if isempty(x),
+	error('No elements to count')
+end
+
+
+[nb_l,nb_c]=size(x);
+
+% Outputs declaration
+xechan=zeros(nb_l,nb_c);
+
+edges=cell(nb_c,1);
+% Local variables
+maxi = max(x);
+mini = min(x);
+
+%% Erreur ? ancien code :
+%% nb_clas_ini=2*round(sqrt(nb_l)-1);	% article Fatima
+
+nb_clas_ini=round(2*sqrt(nb_l)-1);	
+
+pas_ini=(maxi-mini)/nb_clas_ini;	% initial step
+
+for 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);
+end
+
+if (nb_c==1)
+	n=n{1}; edges=edges{1};
+end
+
+
+% ============================== subfunctions
+
+function [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=[];	
+
+% Initialisation
+histt=histo;
+teta = histt/nb;
+pas = step_ini*ones(1,m);
+
+% Calcul de l'ensemble des histogrammes optimaux
+
+for 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�re 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�ation du nouvel histogramme
+		itemp = setdiff(1:m+1-z,classe+1);
+		histt = histt(itemp);
+		pas = pas(itemp);
+		teta = teta(itemp);
+	end
+end
+
+% Recherche du crit�re minimun AIC
+[min_AIC fusion]=min(aic2(1:m));
+
+% Initialisation de histo
+histt=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�re 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�ation 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;
+end
+hist_opt=histt;
+step_opt=pas;
+
+
+%=====================================================
+% Calcul du Critere pour l'ensemble des classes
+
+function 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;
+end
+
+indu = 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'�l�ments 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