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

📄 mfbox_pkmeans.m

📁 toolbox for spm 5 for data, model free analysis
💻 M
字号:
function [centroids,clusters,err,qerrs]=mfbox_pkmeans(method,D,n,epochs,verbose)% k-means clustering method in projective space %% [centroids,clusters,err,qerrs] = mfbox_pkmeans(method,D,n[,epochs[,verbose]])%%  Input and output arguments ([]'s are optional):%   method    (string) 'batch' or 'seq'%   D         (matrix) size dlen x dim, the data%             (struct) map or data struct%   n         (scalar) number of centroids%             (matrix) size n x dim, initial values for the centroids%   [epochs]  (scalar) number of training epochs, 100 by default%   [verbose] (scalar) verbose level, 0 by default%%   centroids (matrix) size n x dim, the k-means centroids%   clusters  (vector) size dlen x 1, cluster number for each sample%   err       (scalar) total quantization error for the data set%   qerr      (vector) quantization error in the clusters%% Copyright by Peter Gruber and Fabian J. Theis% Signal Processing & Information Theory group% Institute of Biophysics, University of Regensburg, Germany% Homepage: http://research.fabian.theis.name%           http://www-aglang.uni-regensburg.de%% This file is free software, subject to the % GNU GENERAL PUBLIC LICENSE, see gpl.txt%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% input arguments and initializationdata = pnorm(D); [dlen,dim] = size(data);if (prod(size(n))==1)  temp = randperm(dlen);  centroids = data(temp(1:n),:);else  centroids = n;  n = size(centroids,1);endif (nargin<4) epochs = 100; endif (nargin<5) verbose = 0; endlr = 0.5;                      % initial learning rate for sequential k-meansclusters  = zeros(1,dlen);       switch method case 'seq' % sequential k-means  len = epochs * dlen;  l_rate = linspace(lr,0,len);  order  = randperm(dlen);  for iter=1:len    x  = data(order(rem(iter,dlen)+1),:);    dx = pdist(x,centroids);    [dist,nearest] = min(dx);    if (x*centroids(nearest,:)'<0) x = -x; end     o = pdist(x,centroids(nearest,:));    if (o~=0) x = pnorm(x - (o*centroids(nearest,:))); end    centroids(nearest,:) = pnorm(centroids(nearest,:) + l_rate(iter)*x);  end  case 'batch' % batch k-means  iter = 0;  old_clusters = zeros(1,dlen);  while (iter<epochs)    [dummy,clusters] = min(pdist(centroids,data));    for i=1:n,      f = find(clusters==i);      s = length(f);      if (s) centroids(i,:) = psum(data(f,:)); end    end        if ((iter>0)&&all(old_clusters==clusters))      if (verbose) fprintf(1,'Convergence in %d iterations\n', iter); end      break;     end        old_clusters = clusters;    iter = iter+1;  end  end% final partitioning and error[qerrs,clusters] = min(pdist(centroids,data));err = sum(qerrs);if (size(clusters,1)==1) clusters = clusters'; end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function d=pdist(x,y)%d = 1-(x*y').^2;returnfunction x=pnorm(x)%n = sqrt(sum(x.^2,2));x = x./(n*ones(1,size(x,2)));returnfunction s=psum(x)%n = size(x,2);[E,D] = eig(x'*x);[dummy,q] = sort(diag(D));s = E(:,q(n))';return

⌨️ 快捷键说明

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