kmeans.m
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:2k
源码类别:

语音合成与识别

开发平台:

Matlab

  1. function [x,esq,j] = kmeans(d,k,x0)
  2. %KMEANS Vector quantisation using K-means algorithm [X,ESQ,J]=(D,K,X0)
  3. %Inputs:
  4. % D contains data vectors (one per row)
  5. % K is number of centres required
  6. % X0 are the initial centres (optional)
  7. %
  8. %Outputs:
  9. % X is output row vectors (K rows)
  10. % ESQ is mean square error
  11. % J indicates which centre each data vector belongs to
  12. %  Based on a routine by Chuck Anderson, anderson@cs.colostate.edu, 1996
  13. %      Copyright (C) Mike Brookes 1998
  14. %
  15. %      Last modified Mon Jul 27 15:48:23 1998
  16. %
  17. %   VOICEBOX home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
  18. %
  19. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  20. %   This program is free software; you can redistribute it and/or modify
  21. %   it under the terms of the GNU General Public License as published by
  22. %   the Free Software Foundation; either version 2 of the License, or
  23. %   (at your option) any later version.
  24. %
  25. %   This program is distributed in the hope that it will be useful,
  26. %   but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  28. %   GNU General Public License for more details.
  29. %
  30. %   You can obtain a copy of the GNU General Public License from
  31. %   ftp://prep.ai.mit.edu/pub/gnu/COPYING-2.0 or by writing to
  32. %   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
  33. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  34. [n,p] = size(d);
  35. if nargin<3
  36.    x = d(ceil(rand(1,k)*n),:);
  37. else
  38.    x=x0;
  39. end
  40. y = x+1;
  41. while any(x(:) ~= y(:))
  42.    z = disteusq(d,x,'x');
  43.    [m,j] = min(z,[],2);
  44.    y = x;
  45.    for i=1:k
  46.       s = j==i;
  47.       if any(s)
  48.          x(i,:) = mean(d(s,:),1);
  49.       else
  50.          q=find(m~=0);
  51.          if isempty(q) break; end
  52.          r=q(ceil(rand*length(q)));
  53.          x(i,:) = d(r,:);
  54.          m(r)=0;
  55.          y=x+1;
  56.       end
  57.    end
  58. end
  59. esq=mean(m,1);