matlab—— K均值聚类算法的步骤和实例

一、K均值聚类法分为如下几个步骤:

1. 初始化聚类中心

      (1)凭经验选择。根据具体问题,凭经验从样本集中选出个 K 比较合适的样本作为初始聚类中心。

      (2)用前 K 个样本作为初始聚类中心。

      (3)将全部样本随机地分成 K 类,计算每类的样本均值,将样本均值作为初始聚类中心。

      (4)密度法。以每个样本为球心,用某个正数为半径作一个球形邻域,落在邻域内的样本数为该点密度,选密度最大点为第一初  始聚类中心。在离开第一点规定距离范围外确定次大密度点,以避免初始聚类中心聚集。

      (5)从 K-1个聚类划分的解中产生 K 个聚类划分的初始聚类中心。先把全部样本看作一个聚类,其聚类中心为样本的总均值;然后确定两聚类问题的聚类中心是一聚类问题的总均值和离它最远的点;以此类推。

2. 初始聚类

     (1)按就近原则将样本归入各聚类中心所代表的类中。

     (2)取一样本,将其归入与其最近的聚类中心的那一类中,重新计算样本均值,更新聚类中心。然后取下一样本,重复操作,直至所有样本归入相应类中。

3. 判断聚类是否合理

      采用误差平方和准则函数判断聚类是否合理,不合理则修改分类。循环进行判断、修改直至达到算法终止条件。

二、K均值聚类法实例:

1.kMeansCluster.m (函数)

function y=kMeansCluster(m,k,isRand)

%Input:
% m- required, matrix data: objects in rows and attributes in columns       
% k      - optional, number of groups (default = 1)
% isRand - optional, if using random initialization isRand=1, otherwise input any number (default)
%it will assign the first k data as initial centroids

%Local Variables
% f      - row number of data that belong to group i
% c      - centroid coordinate size (1:k, 1:maxCol)
% g      - current iteration group matrix size (1:maxRow)
% i      - scalar iterator 
% maxCol - scalar number of rows in the data matrix m = number of attributes
% maxRow - scalar number of columns in the data matrix m = number of objects
% temp   - previous iteration group matrix size (1:maxRow)
% z      - minimum value (not needed)


if nargin<3     
    isRand=0;   
end
if nargin<2
    k=1;
end

[maxRow, maxCol]=size(m);
if maxRow<=k
    y=[m, 1:maxRow];
else

    % initial value of centroid
   if isRand
        p = randperm(size(m,1));      % random initialization
        for i=1:k
            c(i,:)=m(p(i),:);
        end
    else
        for i=1:k
            c(i,:)=m(i,:);        % sequential initialization
        end
   end

    
   temp=zeros(maxRow,1);    % initialize as zero vector    
   while 1
       d=DistMatrix(m,c);   % calculate objcets-centroid distances
       [z,g]=min(d,[],2);   % find group matrix g
        if g==temp
            break;          % stop the iteration
        else
            temp=g;         % copy group matrix to temporary variable
        end
            for i=1:k
                 f=find(g==i);
                 if f            % only compute centroid if f is not empty
                     c(i,:)=mean(m(find(g==i),:),1);
                 end
            end
   end
                     y=[m,g]
end
                     
                

2.DistMatrix.m (函数)

function d=DistMatrix(A,B)

[hA,wA]=size(A);
[hB,wB]=size(B);

 if wA ~= wB
     error(' second dimension of A and B must be the same'); 
 end
 
 for k=1:wA
      C{k}= repmat(A(:,k),1,hB);
      D{k}= repmat(B(:,k),1,hA);
 end
 
 S=zeros(hA,hB);
 for k=1:wA
      S=S+(C{k}-D{k}').^2;
 end
      d=sqrt(S);
            
            

基于(1)和(2)的matlab代码,请将

m = [ 1 1; 2 1; 4 3; 5 4]数据分为2类,即k=2;

创建test3.m脚本,脚本内容如下:

%test3
clc
clear
m = [ 1 1; 2 1; 4 3; 5 4]
k=2;

tic
y=kMeansCluster(m,k);
toc

在命令行中显示出出最终的聚类结果及算法运行时间

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读