K-means算法Matlab实现
本文只给出二维数据的K-means算法Matlab实现,理论推导参考了算法收敛性证明、【机器学习】K-means(非常详细)、聚类算法——K-均值算法,此处不详细介绍。
编写程序过程中,发现初始化不同的起始中心点,算法运行的结果不同,有时会收敛至局部最优值。为了解决这个问题,可以使用改进的K-means++算法,本文没有进行实现。
实现代码如下:
clc;clear all;
p=[1 2;2 2;2 5;3,3;9,14;10,13;10,15;11,16;15,6;16,5;16,8]';
x=p(1,:);
y=p(2,:);
k=3;
cluster=zeros(1,length(x));
center=zeros(2,k);
%绘制二维数据
%scatter(x,y);
%初始化中心
for i=1:k
offset=5;
center(:,i)=p(:,i+offset);%设置不同的起始中心点,
end
while(1)
%分类
for i=1:length(x)
for j=1:k
distance(j)=norm(center(:,j)-p(:,i));%计算与每个中心的距离
end
[min_dist(i),index]=min(distance);%求出最小值及其索引
cluster(i)=index;
end
%计算误差平方和
J=sum(min_dist);
%绘图
clf;
scatter(x,y,[],cluster);
hold on;
scatter(center(1,:),center(2,:),'filled','black');title(['误差平方和为' num2str(J)]);
pause(1);%延时一秒
%重新寻找质心
for i=1:k
new_center(:,i)= mean(p(:,cluster==i),2);%计算新的中心
end
%跳出循环
if new_center==center
break;
else
center=new_center;
end
end