原理:
(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类
聚成4类
聚成7类
样本3维
聚成3类
网友评论