⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 som_kmeans.m

📁 很全的som工具箱 四个demo可为初学者提够帮助
💻 M
字号:
function [codes,clusters,err] = som_kmeans(method, D, k, epochs, verbose)% SOM_KMEANS K-means algorithm.%% [codes,clusters,err] = som_kmeans(method, D, k, [epochs], [verbose])%%  Input and output arguments ([]'s are optional):  %    method     (string) k-means algorithm type: 'batch' or 'seq'%    D          (matrix) data matrix%               (struct) data or map struct%    k          (scalar) number of centroids%    [epochs]   (scalar) number of training epochs%    [verbose]  (scalar) if <> 0 display additonal information%%    codes      (matrix) codebook vectors%    clusters   (vector) cluster number for each sample%    err        (scalar) total quantization error for the data set%% See also KMEANS_CLUSTERS, SOM_MAKE, SOM_BATCHTRAIN, SOM_SEQTRAIN.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Function has been renamed by Kimmo Raivio, because matlab65 also have % kmeans function 1.10.02%% input argumentsif isstruct(D),     switch D.type,     case 'som_map', data = D.codebook;     case 'som_data', data = D.data;     end else     data = D; end[l dim]   = size(data);if nargin < 4 | isempty(epochs) | isnan(epochs), epochs = 100; endif nargin < 5, verbose = 0; end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% actionrand('state', sum(100*clock)); % init rand generatorlr = 0.5;                      % learning rate for sequential k-meanstemp      = randperm(l);centroids = data(temp(1:k),:);res       = zeros(k,l);clusters  = zeros(1, l);if dim==1,     [codes,clusters,err] = scalar_kmeans(data,k,epochs);     return; endswitch method case 'seq',  len = epochs * l;  l_rate = linspace(lr,0,len);  order  = randperm(l);  for iter = 1:len    x  = D(order(rem(iter,l)+1),:);                       dx = x(ones(k,1),:) - centroids;     [dist nearest] = min(sum(dx.^2,2));     centroids(nearest,:) = centroids(nearest,:) + l_rate(iter)*dx(nearest,:);  end  [dummy clusters] = min(((ones(k, 1) * sum((data.^2)', 1))' + ...			 ones(l, 1) * sum((centroids.^2)',1) - ...			 2.*(data*(centroids')))'); case 'batch',  iter      = 0;  old_clusters = zeros(k, 1);  while iter<epochs        [dummy clusters] = min(((ones(k, 1) * sum((data.^2)', 1))' + ...			   ones(l, 1) * sum((centroids.^2)',1) - ...			   2.*(data*(centroids')))');    for i = 1:k      f = find(clusters==i);      s = length(f);      if s, centroids(i,:) = sum(data(f,:)) / s; end    end    if iter      if sum(old_clusters==clusters)==0	if verbose, fprintf(1, 'Convergence in %d iterations\n', iter); end	break;       end    end    old_clusters = clusters;    iter = iter + 1;  end    [dummy clusters] = min(((ones(k, 1) * sum((data.^2)', 1))' + ...			  ones(l, 1) * sum((centroids.^2)',1) - ...			  2.*(data*(centroids')))'); otherwise,  fprintf(2, 'Unknown method\n');enderr = 0;for i = 1:k  f = find(clusters==i);  s = length(f);  if s, err = err + sum(sum((data(f,:)-ones(s,1)*centroids(i,:)).^2,2)); endendcodes = centroids;return; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function [y,bm,qe] = scalar_kmeans(x,k,maxepochs)    nans = ~isfinite(x);    x(nans) = [];     n = length(x);     mi = min(x); ma = max(x)    y = linspace(mi,ma,k)';     bm = ones(n,1);     bmold = zeros(n,1);     i = 0;     while ~all(bm==bmold) & i<maxepochs,         bmold  = bm;          [c bm] = histc(x,[-Inf; (y(2:end)+y(1:end-1))/2; Inf]);        y      = full(sum(sparse(bm,1:n,x,k,n),2));        zh     = (c(1:end-1)==0);        y(~zh) = y(~zh)./c(~zh);        inds   = find(zh)';        for j=inds, if j==1, y(j) = mi; else y(j) = y(j-1) + eps; end, end                 i=i+1;    end    if i==maxepochs, [c bm] = histc(x,[-Inf; (y(2:end)+y(1:end-1))/2; Inf]); end    if nargout>2, qe = sum(abs(x-y(bm)))/n; end    if any(nans),        notnan = find(~nans); n = length(nans);        y  = full(sparse(notnan,1,y ,n,1)); y(nans)  = NaN;          bm = full(sparse(notnan,1,bm,n,1)); bm(nans) = NaN;        if nargout>2, qe = full(sparse(notnan,1,qe,n,1)); qe(nans) = NaN; end    end            return; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -