K-means聚类算法Matlab代码

原理:

(1) 从 n个样本随机选择作为初始NumCluster个聚类中心;

(2) 计算每个样本与聚类中心的距离,根据最小距离划分到相应类中;

(3) 重新计算每个聚类的中心,即所有类内样本求平均值;

(4) 循环(2)到(3)直到每个聚类不再发生变化为止。

K-means算法的matlab代码,输入样本和聚类个数,返回所有类内距离和之和和收敛迭代次数,画图部分,用了基本的7种颜色,故8类以上无法画图会有提示,并且4维以上无法画图。

主要函数解析

%% ———————–K-means聚类函数———————————

% 入参:

%    NumCluster 聚类个数

%    x          样本

% 出参:

%    f        所有类内距离和之和

%    g        收敛迭代次数

%% ———————————————————————–

function [f,g]=K_means(NumCluster,x)

g=1;

[N,L]=size(x);

%% 从样本中随机获取值初始化Numcluster个类的质点

r=randperm(N);

for t=1:NumCluster

    Center(t,1:L)=x(r(t),1:L)

end

ert=10;

while (ert~=0)

    M_Center=Center;

    %% 步骤1:将所有样本划分到对应类

    for j=1:N

        %% 计算样本到各质点距离

        for t=1:NumCluster

            Dist(t,1)=Dis(x(j,1:L),Center(t,1:L));

        end

        %% 将距离最近的质点划分到对应类

        Min_dis=min(Dist);

        [m,l]=find(Min_dis==Dist);

        for t=1:NumCluster

            if m==t

                x(j,L+1)=t;

            end

        end

    end

    %% 步骤2:质点迭代,将所有类的质点求取平均值替换原有质点

    for t=1:NumCluster

        [m,l]=find(x(:,L+1)==t);

        Center(t,:)=mean(x(m,1:L),1);

    end

    %% 计量迭代次数

    g=g+1;

    %% 计算相邻打迭代的质点变化量,若无变化,则迭代结束

    ert=abs(Center(:,1:L)-M_Center(:,1:L));

end

%% 计算所有类内间距和

sm=zeros(NumCluster,1);

for t=1:NumCluster

    [m,l]=find(x(:,3)==t);

    Len=size(m,1);

    for i=1:Len

        sm(t,1)=sm(t,1)+ sqrt( sum( ( x(i,1:L)-Center(t,1:L) ).^2,2) );

    end

end

f=sum(sm,1);

%% 画图

fprintf(‘画图\n’);

color1={‘rs’,’bs’,’ms’,’ks’,’gs’,’cs’,’ys’};

color2={‘r*’,’b*’,’m*’,’k*’,’g*’,’c*’,’y*’};

%% 最多提供7个类别,3个维度的画图

if NumCluster<8 && L<4

    %% 2维情况

    if L==2

        plot(x(:,1),x(:,2),’o’);

        for t=1:NumCluster

            hold on

            plot(Center(t,1),Center(t,2),color1{t})

            [m,l]=find(x(:,3)==t);

            hold on

            plot(x(m,1),x(m,2),color2{t});

        end

    end

    %% 3维情况

    if L==3

        plot3(x(:,1),x(:,2),x(:,3),’o’);

        for t=1:NumCluster

            hold on

            plot3(Center(t,1),Center(t,2),Center(t,3),color1{t})

            [m,l]=find(x(:,4)==t);

            hold on

            plot3(x(m,1),x(m,2),x(m,3),color2{t});

        end

    end

else

    fprintf(‘error\n’);

end

end

下载地址:http://download.csdn.net/detail/aircherfjt/5425275

另一个k-means domo地址:http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/AppletKM.html

样本2维

聚成2类

《K-means聚类算法Matlab代码》

聚成4类

《K-means聚类算法Matlab代码》

聚成7类

《K-means聚类算法Matlab代码》

样本3维

聚成3类

《K-means聚类算法Matlab代码》

    原文作者:聚类算法
    原文地址: https://blog.csdn.net/swairf/article/details/8958411
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞