diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_gapindex.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_gapindex.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,72 @@
+function [t,r,Cd,S] = som_gapindex(sM, base, between)
+ 
+% SOM_GAPINDEX Gap clustering evaluation index.
+%
+% [t,r] = som_gapindex(sM, base, [between])
+%
+%  Input and output arguments ([]'s are optional):  
+%    sM        (struct) map struct
+%    base      (vector) clusters indeces for each map unit, map units
+%                       with index<=0 or NaN are not taken into account
+%    [between] (vector) indices of prototypes which are "between" clusters:
+%                       the associated distances are doubled
+% 
+%    t         (scalar) Gap index index for the clustering (=mean(r))
+%    r         (vector) maximum Gap index for each cluster (size max(base) x 1)    
+% 
+% See also  KMEANS, KMEANS_CLUSTERS, SOM_GAPINDEX.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if nargin<3, between = find(isnan(base)); end
+
+nc = max(base); 
+cinds = cell(nc,1); 
+for i=1:nc, cinds{i} = find(base==i); end
+ 
+% distances between neighboring prototypes
+Ne = som_neighbors(sM,'N1'); 
+Md = som_mdist(sM.codebook,2,[],Ne);
+Md(Ne==0) = NaN;
+
+Md(between,:) = Md(between,:)*2;
+Md(:,between) = Md(:,between)*2;
+Md(between,between) = Md(between,between)/2;
+ 
+% dispersion in each cluster 
+S = zeros(nc,1);
+for i=1:nc, 
+    inds = setdiff(cinds{i},between);    
+    if any(inds), 
+        indist = Md(inds,inds); 
+        for j=1:size(indist,1), indist(j,j) = NaN; end
+        indist = indist(isfinite(indist(:))); 
+        if any(indist), S(i) = mean(indist); end
+    end
+end 
+ 
+% distances between clusters
+Cd = zeros(nc,nc) + NaN;
+for i=1:nc,
+    inds1 = cinds{i}; 
+    for j=1:nc, 
+        inds2 = cinds{j}; 
+	od = Md(inds1,inds2); 
+	od = od(isfinite(od(:)));
+	if any(od), Cd(i,j) = mean(od(:)); end        
+    end    
+end
+
+% Gap index
+R = NaN * zeros(nc);
+for i = 1:nc
+  for j = i+1:nc
+    R(i,j) = (S(i) + S(j))/Cd(i,j);
+    R(j,i) = R(i,j); 
+  end
+end
+r = max(R,[],2);
+ 
+t = mean(r(isfinite(r)));
+ 
+return;