MATLAB 实现K-means算法

本文参考头条文章K-means算法MATLAB实现原文地址

K-menas算法

概念:

K-MEANS算法是对含有n个数据的数据集,根据数据之间相似性程度分类为k类。k-means 算法接受输入量 k ;相似度的度量有不同的量来表示,常见的有欧氏距离,用户也可以自定义衡量相似度的量,比如遥感影像分类中根据每个像素rgb值来衡量相似性。

实现步骤:

1、随机选定k个对象作为聚类中心;

2、计算每个点到k个聚类中心的距离,点局那个聚类中心的距离最小,就把点划分到哪个类别中。

3、计算新的聚类中心。

4、当满足一定条件(两次聚类中心的变化和小或者循环达到一定的次数)时,则停止计算,否则进行步骤2;

MATLAB代码实现:

K-means.m

function [Idx, Center]=K_means(x,k)

% Idx是数据属于哪个类的标记,Center是每个类的中心位置

% X是全部二维数据点,k是分为k类

figure;

plot(x(:,1),x(:,2),'bo');hold on;

plot(x(1:k,1),x(1:k,2),'r*');hold off;

grid on;

title('raw data and original center');

len=length(x);

Idx=zeros(len,1);

c=x(1:k,:);

for i=1:10000

for j=1:len

xtemp=x(j,:);

for jj=1:k

d(jj)=norm(xtemp-c(jj,:));

end

[~,id]=min(d);

Idx(j)=id;

end

for j=1:k

L=x(Idx==j,:);

c(j,:)=mean(L);

end

end

Center=c;

主函数.m

close all;

a=rand(30,2)*20;

b=rand(30,2)*5;

c=rand(30,2)*10;

figure;

plot(a(:,1),a(:,2),'bo');hold on;

plot(b(:,1),b(:,2),'ro');

plot(c(:,1),c(:,2),'ko');hold off;

grid on;

title('raw data');

x=[a;b;c];

[Idx,Center]=K_means(x,3);

figure;

plot(x(Idx==1,1),x(Idx==1,2),'ko');hold on;

plot(x(Idx==2,1),x(Idx==2,2),'go');

plot(x(Idx==3,1),x(Idx==3,2),'bo');

plot(Center(:,1),Center(:,2),'r*'); hold off;

grid on;

title('k-means cluster result');

结果图如下:

MATLAB 实现K-means算法

最初的聚类中心

MATLAB 实现K-means算法

聚类结果图:

MATLAB 实现K-means算法