kmeans聚类算法matlab实现

来源:互联网 发布:如果关羽不失荆州 知乎 编辑:程序博客网 时间:2024/04/28 10:05

运行界面(可以支持任意维数据)



单介绍下kmeans算法流程:

假设要把样本集分为c个类别,算法描述如下:
(1)适当选择c个类的初始中心;
(2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;
(3)利用均值等方法更新该类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。
该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式。
matlab实现:
function [ class count]=k_means(data,k);%clear%load testdata.mat%k=2;sum=size(data,1);for i=1:k  centroid(i,:)=data(floor(sum/k)*(i-1)+1,:);endticck=0;while 1    temp=zeros(1,2);;    count=zeros(1,k);    ck=ck+1    for i=1:sum        for j=1:k            dist(j)=norm(data(i,:)-centroid(j,:));        end            [a min_dist]=min(dist);            count(min_dist)=count(min_dist)+1;            class(min_dist,count(min_dist))=i;    end      %重新计算类中心        for i=1:k           for j=1:count(i)            temp=temp+data(class(i,j),:);        end        temp_centroid(i,:)=temp/(count(i));        temp(1,:)=0;      % temp_centroid(i,:)=re_calculate(class(i,:),count(i),tdata);    end      %计算新的类中心和原类中心距离centr_dist;    for i=1:k        centr_dist(i)=norm(temp_centroid(i,:)-centroid(i,:));    end    if max(centr_dist)<=0        break;    else        for i=1:k            centroid(i,:)=temp_centroid(i,:);            %重新进行前俩不        end    end endtoc    

数据点是鼠标插进去的,通过界面可以很清晰的看到分类过程,功能截图如下:

源码连接:kmeans聚类算法源码

0 0
原创粉丝点击