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

📄 dckmeans.m

📁 一个用于聚类的工具箱
💻 M
字号:
function [Classes,Centres,FinalDistance]=dcKMeans(Data,k,InitCentres,MaxIters)
%DCKMEANS Performs k-means clustering
% Classes=DCKMEANS(Data,k,InitCentres) where Data is a matrix with
% variables in columns and records in rows, k is the number of 
% clusters to search for and InitCentres is a list of initial centres.
% Classes=DCKMEANS(Data,k) randomly chooses initial centres from data set.
% [Classes,Centres,FinalDistance]=DCKMEANS(Data,k,InitCentres) also returns
% the centres and distances of each point to its nearest centre.

% Copyright (C) David Corney 2000		D.Corney@cs.ucl.ac.uk

if nargin < 3
	InitCentres = ChooseInitialCentres(Data,k);		%randomly choose starting point (where needed)
end
Centres=InitCentres;
OldCentres=Centres;
if nargin<4
   MaxIters=500;
end

[R,C]=size(Data);

DataSq=repmat(sum(Data.^2,2),1,k);	%sum squared data - save re-calculating repeatedly later
%Do we need DataSq? It's constant, and we're minimsing things...


for i = 1:MaxIters
   
   Dist = DataSq + repmat(sum((Centres.^2)',1),R,1) - 2.*(Data*(Centres'));   %i.e. d^2 = (x-c)^2 = x^2 + c^2 -2xc

   [D,Centre]=min(Dist,[],2);		%label of nearest centre for each point

   for j=1:k
      idx=find(Centre==j);
      if length(idx)>0
         Centres(j,:)=mean(Data(idx,:));
      end
   end
   
   Change=sum(sum(abs(OldCentres-Centres)));
   if Change < 1e-10	%Have we converged yet?
      break
   end
   OldCentres=Centres;
   
end


[FinalDistance,Classes]=min(Dist,[],2);		%label points one last time

⌨️ 快捷键说明

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