Mercurial > hg > camir-aes2014
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 function [t,r,Cd,S] = som_gapindex(sM, base, between) | |
2 | |
3 % SOM_GAPINDEX Gap clustering evaluation index. | |
4 % | |
5 % [t,r] = som_gapindex(sM, base, [between]) | |
6 % | |
7 % Input and output arguments ([]'s are optional): | |
8 % sM (struct) map struct | |
9 % base (vector) clusters indeces for each map unit, map units | |
10 % with index<=0 or NaN are not taken into account | |
11 % [between] (vector) indices of prototypes which are "between" clusters: | |
12 % the associated distances are doubled | |
13 % | |
14 % t (scalar) Gap index index for the clustering (=mean(r)) | |
15 % r (vector) maximum Gap index for each cluster (size max(base) x 1) | |
16 % | |
17 % See also KMEANS, KMEANS_CLUSTERS, SOM_GAPINDEX. | |
18 | |
19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
20 | |
21 if nargin<3, between = find(isnan(base)); end | |
22 | |
23 nc = max(base); | |
24 cinds = cell(nc,1); | |
25 for i=1:nc, cinds{i} = find(base==i); end | |
26 | |
27 % distances between neighboring prototypes | |
28 Ne = som_neighbors(sM,'N1'); | |
29 Md = som_mdist(sM.codebook,2,[],Ne); | |
30 Md(Ne==0) = NaN; | |
31 | |
32 Md(between,:) = Md(between,:)*2; | |
33 Md(:,between) = Md(:,between)*2; | |
34 Md(between,between) = Md(between,between)/2; | |
35 | |
36 % dispersion in each cluster | |
37 S = zeros(nc,1); | |
38 for i=1:nc, | |
39 inds = setdiff(cinds{i},between); | |
40 if any(inds), | |
41 indist = Md(inds,inds); | |
42 for j=1:size(indist,1), indist(j,j) = NaN; end | |
43 indist = indist(isfinite(indist(:))); | |
44 if any(indist), S(i) = mean(indist); end | |
45 end | |
46 end | |
47 | |
48 % distances between clusters | |
49 Cd = zeros(nc,nc) + NaN; | |
50 for i=1:nc, | |
51 inds1 = cinds{i}; | |
52 for j=1:nc, | |
53 inds2 = cinds{j}; | |
54 od = Md(inds1,inds2); | |
55 od = od(isfinite(od(:))); | |
56 if any(od), Cd(i,j) = mean(od(:)); end | |
57 end | |
58 end | |
59 | |
60 % Gap index | |
61 R = NaN * zeros(nc); | |
62 for i = 1:nc | |
63 for j = i+1:nc | |
64 R(i,j) = (S(i) + S(j))/Cd(i,j); | |
65 R(j,i) = R(i,j); | |
66 end | |
67 end | |
68 r = max(R,[],2); | |
69 | |
70 t = mean(r(isfinite(r))); | |
71 | |
72 return; |