diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_estimate_gmm.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_estimate_gmm.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,79 @@
+function [K,P] = som_estimate_gmm(sM, sD)
+
+%SOM_ESTIMATE_GMM Estimate a gaussian mixture model based on map.
+%
+% [K,P] = som_estimate_gmm(sM, sD)
+%
+%  Input and output arguments:
+%   sM    (struct) map struct
+%   sD    (struct) data struct
+%         (matrix) size dlen x dim, the data to use when estimating
+%                  the gaussian kernels
+%
+%   K     (matrix) size munits x dim, kernel width parametes for 
+%                  each map unit
+%   P     (vector) size 1 x munits, a priori probability of each map unit
+%
+% See also SOM_PROBABILITY_GMM.
+
+% Reference: Alhoniemi, E., Himberg, J., Vesanto, J.,
+%   "Probabilistic measures for responses of Self-Organizing Maps", 
+%   Proceedings of Computational Intelligence Methods and
+%   Applications (CIMA), 1999, Rochester, N.Y., USA, pp. 286-289.
+
+% Contributed to SOM Toolbox vs2, February 2nd, 2000 by Esa Alhoniemi
+% Copyright (c) by Esa Alhoniemi
+% http://www.cis.hut.fi/projects/somtoolbox/
+
+% ecco 180298 juuso 050100 250400
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+[c, dim] = size(sM.codebook);
+M = sM.codebook;
+
+if isstruct(sD), D = sD.data; else D = sD; end
+dlen = length(D(:,1));
+
+%%%%%%%%%%%%%%%%%%%%%
+% compute hits & bmus
+
+[bmus, qerrs] = som_bmus(sM, D);
+hits = zeros(1,c);
+for i = 1:c, hits(i) = sum(bmus == i); end
+
+%%%%%%%%%%%%%%%%%%%%
+% a priori  
+
+% neighborhood kernel
+r  = sM.trainhist(end).radius_fin; % neighborhood radius
+if isempty(r) | isnan(r), r=1; end
+Ud = som_unit_dists(sM);
+Ud = Ud.^2; 
+r = r^2; 
+if r==0, r=eps; end % to get rid of div-by-zero errors
+switch sM.neigh, 
+ case 'bubble',   H = (Ud<=r); 
+ case 'gaussian', H = exp(-Ud/(2*r)); 
+ case 'cutgauss', H = exp(-Ud/(2*r)) .* (Ud<=r);
+ case 'ep',       H = (1-Ud/r) .* (Ud<=r);
+end  
+
+% a priori prob. = hit histogram weighted by the neighborhood kernel
+P = hits*H;
+P = P/sum(P);              
+
+%%%%%%%%%%%%%%%%%%%%
+% kernel widths (& centers)
+
+K = ones(c, dim) * NaN; % kernel widths
+for m = 1:c,
+  w = H(bmus,m);
+  w = w/sum(w);
+  for i = 1:dim,
+    d = (D(:,i) - M(m,i)).^2;   % compute variance of ith
+    K(m,i) = w'*d;              % variable of centroid m
+  end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%