Matlab实现K均值聚类

来源:互联网 发布:翻墙用谷歌软件 编辑:程序博客网 时间:2024/06/07 01:26

作为第一个博客,我写了一个简单的K均值聚类算法。过程大致如下:
(1)从n个样本中任意选择(一般是随机分配),k个作为初始聚类中心;
(2)对于剩下的其它样本点,根据它们与这些聚类中心的距离,分别将它们分配给与其最相似的中心所在的类别 C j
(3)计算每个新类的聚类中心;
(4)不断重复步骤(2)(3),直到所有样本点的分类不再改变或类中心不再改变。

一、方法说明

  • 在(2)计算距离的时候,我用的是欧式距离

    dij=k=1n(XikXjk)2

    其中,i和j表示第i个点和第j个点,n表示聚类对象是n维的,比如聚类对象为2维的,我们计算第一个点和第二个点的欧式距离:
    d12=(x11x21)2+(x12x22)2


  • 在(3)更新聚类中心时,对于每一个类,重新计算该类的中心:

    uj=mi=11{c(i)=j}x(i)mi=11{c(i)=j}


  • 二、Matlab实现
    数据是用rand随机生成的100个点,K均值聚类的程序如下:

    function [C,new_u,iter]=Kmeans(data,k) %该程序对data聚类,k%从data中随机选择k个样本作为初始均值向量{u1,u2}[row,col]=size(data);%row为样本个数,col为维数%随机抽取样本点作为初始中心的向量rand('seed',9);num=randsample(length(data),k,'false');u=zeros*data(num,:);new_u=data(num,:);%初始化元胞,和迭代次数C=cell(1,k);iter=1;while(new_u~=u)    u=new_u;C=cell(1,k);    for i=1:k    %计算每一个样本点与中心的欧式距离        dist(:,i)=sqrt(sum((data-repmat(u(i,:),row,1)).^2,2));      end    for j=1:row        index=find(dist(j,:)==min(dist(j,:)));        C{1,index}=[C{1,index};data(j,:)];    end     for i=1:k        new_u(i,:)=sum(C{1,i})/length(C{1,i});    end    iter=iter+1; %迭代次数endKmeansPlot(C,new_u,k);%画图end


    聚类结果如下:

    这里写图片描述


    三、伪代码
    在这里,给读者再贴上一个周志华写的机器学习里k均值聚类的伪代码,便于理解。
    这里写图片描述


    四、总结

    1. k均值不需要计算任意两点的距离,因此比其它聚类方法有更快的收敛速度
    2. k均值被批评可能陷入局部最优,全局最优需要借助模拟退火算法或遗传算法
    3. 容易受到初始点选择的影响,不适合非凸问题,受异常数据影响受不同类别密度方差大小的影响,解决方法是二分k均值

    [1]王星编著.大数据分析 方法与应用[M].北京:清华大学出版社.2013.
    [2]周志华著.机器学习[M].北京:清华大学出版社.2016.

    1 0