annotate toolboxes/MIRtoolbox1.3.2/somtoolbox/som_gapindex.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 function [t,r,Cd,S] = som_gapindex(sM, base, between)
Daniel@0 2
Daniel@0 3 % SOM_GAPINDEX Gap clustering evaluation index.
Daniel@0 4 %
Daniel@0 5 % [t,r] = som_gapindex(sM, base, [between])
Daniel@0 6 %
Daniel@0 7 % Input and output arguments ([]'s are optional):
Daniel@0 8 % sM (struct) map struct
Daniel@0 9 % base (vector) clusters indeces for each map unit, map units
Daniel@0 10 % with index<=0 or NaN are not taken into account
Daniel@0 11 % [between] (vector) indices of prototypes which are "between" clusters:
Daniel@0 12 % the associated distances are doubled
Daniel@0 13 %
Daniel@0 14 % t (scalar) Gap index index for the clustering (=mean(r))
Daniel@0 15 % r (vector) maximum Gap index for each cluster (size max(base) x 1)
Daniel@0 16 %
Daniel@0 17 % See also KMEANS, KMEANS_CLUSTERS, SOM_GAPINDEX.
Daniel@0 18
Daniel@0 19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 20
Daniel@0 21 if nargin<3, between = find(isnan(base)); end
Daniel@0 22
Daniel@0 23 nc = max(base);
Daniel@0 24 cinds = cell(nc,1);
Daniel@0 25 for i=1:nc, cinds{i} = find(base==i); end
Daniel@0 26
Daniel@0 27 % distances between neighboring prototypes
Daniel@0 28 Ne = som_neighbors(sM,'N1');
Daniel@0 29 Md = som_mdist(sM.codebook,2,[],Ne);
Daniel@0 30 Md(Ne==0) = NaN;
Daniel@0 31
Daniel@0 32 Md(between,:) = Md(between,:)*2;
Daniel@0 33 Md(:,between) = Md(:,between)*2;
Daniel@0 34 Md(between,between) = Md(between,between)/2;
Daniel@0 35
Daniel@0 36 % dispersion in each cluster
Daniel@0 37 S = zeros(nc,1);
Daniel@0 38 for i=1:nc,
Daniel@0 39 inds = setdiff(cinds{i},between);
Daniel@0 40 if any(inds),
Daniel@0 41 indist = Md(inds,inds);
Daniel@0 42 for j=1:size(indist,1), indist(j,j) = NaN; end
Daniel@0 43 indist = indist(isfinite(indist(:)));
Daniel@0 44 if any(indist), S(i) = mean(indist); end
Daniel@0 45 end
Daniel@0 46 end
Daniel@0 47
Daniel@0 48 % distances between clusters
Daniel@0 49 Cd = zeros(nc,nc) + NaN;
Daniel@0 50 for i=1:nc,
Daniel@0 51 inds1 = cinds{i};
Daniel@0 52 for j=1:nc,
Daniel@0 53 inds2 = cinds{j};
Daniel@0 54 od = Md(inds1,inds2);
Daniel@0 55 od = od(isfinite(od(:)));
Daniel@0 56 if any(od), Cd(i,j) = mean(od(:)); end
Daniel@0 57 end
Daniel@0 58 end
Daniel@0 59
Daniel@0 60 % Gap index
Daniel@0 61 R = NaN * zeros(nc);
Daniel@0 62 for i = 1:nc
Daniel@0 63 for j = i+1:nc
Daniel@0 64 R(i,j) = (S(i) + S(j))/Cd(i,j);
Daniel@0 65 R(j,i) = R(i,j);
Daniel@0 66 end
Daniel@0 67 end
Daniel@0 68 r = max(R,[],2);
Daniel@0 69
Daniel@0 70 t = mean(r(isfinite(r)));
Daniel@0 71
Daniel@0 72 return;