annotate toolboxes/MIRtoolbox1.3.2/somtoolbox/db_index.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] = db_index(D, cl, C, p, q)
Daniel@0 2
Daniel@0 3 % DB_INDEX Davies-Bouldin clustering evaluation index.
Daniel@0 4 %
Daniel@0 5 % [t,r] = db_index(D, cl, C, p, q)
Daniel@0 6 %
Daniel@0 7 % Input and output arguments ([]'s are optional):
Daniel@0 8 % D (matrix) data (n x dim)
Daniel@0 9 % (struct) map or data struct
Daniel@0 10 % cl (vector) cluster numbers corresponding to data samples (n x 1)
Daniel@0 11 % [C] (matrix) prototype vectors (c x dim) (default = cluster means)
Daniel@0 12 % [p] (scalar) norm used in the computation (default == 2)
Daniel@0 13 % [q] (scalar) moment used to calculate cluster dispersions (default = 2)
Daniel@0 14 %
Daniel@0 15 % t (scalar) Davies-Bouldin index for the clustering (=mean(r))
Daniel@0 16 % r (vector) maximum DB index for each cluster (size c x 1)
Daniel@0 17 %
Daniel@0 18 % See also KMEANS, KMEANS_CLUSTERS, SOM_GAPINDEX.
Daniel@0 19
Daniel@0 20 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 21 %% input arguments
Daniel@0 22
Daniel@0 23 if isstruct(D),
Daniel@0 24 switch D.type,
Daniel@0 25 case 'som_map', D = D.codebook;
Daniel@0 26 case 'som_data', D = D.data;
Daniel@0 27 end
Daniel@0 28 end
Daniel@0 29
Daniel@0 30 % cluster centroids
Daniel@0 31 [l dim] = size(D);
Daniel@0 32 u = unique(cl);
Daniel@0 33 c = length(u);
Daniel@0 34 if nargin <3,
Daniel@0 35 C = zeros(c,dim);
Daniel@0 36 for i=1:c,
Daniel@0 37 me = nanstats(D(find(cl==u(i)),:));
Daniel@0 38 C(i,:) = me';
Daniel@0 39 end
Daniel@0 40 end
Daniel@0 41
Daniel@0 42 u2i = zeros(max(u),1); u2i(u) = 1:c;
Daniel@0 43 D = som_fillnans(D,C,u2i(cl)); % replace NaN's with cluster centroid values
Daniel@0 44
Daniel@0 45 if nargin <4, p = 2; end % euclidian distance between cluster centers
Daniel@0 46 if nargin <5, q = 2; end % dispersion = standard deviation
Daniel@0 47
Daniel@0 48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 49 %% action
Daniel@0 50
Daniel@0 51 % dispersion in each cluster
Daniel@0 52 for i = 1:c
Daniel@0 53 ind = find(cl==u(i)); % points in this cluster
Daniel@0 54 l = length(ind);
Daniel@0 55 if l > 0
Daniel@0 56 S(i) = (mean(sqrt(sum((D(ind,:) - ones(l,1) * C(i,:)).^2,2)).^q))^(1/q);
Daniel@0 57 else
Daniel@0 58 S(i) = NaN;
Daniel@0 59 end
Daniel@0 60 end
Daniel@0 61
Daniel@0 62 % distances between clusters
Daniel@0 63 %for i = 1:c
Daniel@0 64 % for j = i+1:c
Daniel@0 65 % M(i,j) = sum(abs(C(i,:) - C(j,:)).^p)^(1/p);
Daniel@0 66 % end
Daniel@0 67 %end
Daniel@0 68 M = som_mdist(C,p);
Daniel@0 69
Daniel@0 70 % Davies-Bouldin index
Daniel@0 71 R = NaN * zeros(c);
Daniel@0 72 r = NaN * zeros(c,1);
Daniel@0 73 for i = 1:c
Daniel@0 74 for j = i+1:c
Daniel@0 75 R(i,j) = (S(i) + S(j))/M(i,j);
Daniel@0 76 end
Daniel@0 77 r(i) = max(R(i,:));
Daniel@0 78 end
Daniel@0 79
Daniel@0 80 t = mean(r(isfinite(r)));
Daniel@0 81
Daniel@0 82 return;
Daniel@0 83