本文参考头条文章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');
结果图如下:
最初的聚类中心
聚类结果图: