kmean算法代码
function [Idx,C,D]=my_kmeans(X,c)
%%k-均值分类
%输入:X样本集 c聚类簇数
%输出:Idx聚类标志 C聚类中心 D每个点到质心的聚类
[m,n]=size(X);%样本数m,样本维数
%从X中随机选择选择c个样本作为初始向量
center = X(ceil(rand(c,1)*m),:);%产生随机数[0~1],并放大至[0~m],用ceil向上取整数,使产生c个[1~m]的随机整数
k=0
while 1
k=k+1
%%计算样本与各质心的距离
d = zeros(m,c);
new_center = zeros(c,n);%新的质心
for i = 1 : c
d(:,i) = sqrt(sum(bsxfun(@minus,X,center(i,:)).^2,2));
end
%%根据最近的均值向量确定簇标志
[~,Idx]=min(d,[],2);
%%计算新的均值向量
for i = 1 : c
id = (Idx==i);%i类
new_center(i,:) = sum(X.*id)/sum(id);
end
if new_center==center %如果当前均值向量不变
C = center;%C聚类中心
D = d;%样本与各质心的距离
break;
else%当前均值向量改变,则更新当前均值向量
center=new_center;
end
end
end
每次迭代的时间复杂度为O(c),c为聚类类数
绘图
function MyPlot(X,k,C,Idx)
%%绘图
%%根据矩阵的维度绘出图像
%%k聚类簇数 Idx聚类标志
[M,N]=size(X);
if N==2 %二维图像
hold on
title('二维聚类')
color=rand(k,3);%随机生成k种颜色
for i =1:M
plot(X(i,1),X(i,2),'*','Color',color(Idx(i),:))
end
plot(C(:,1),C(:,2),'o')%绘制聚类中心
xlabel('x')
ylabel('y')
elseif N==3%三维图像
color=rand(k,3);%随机生成k种颜色
for i =1:M
plot3(X(i,1),X(i,2),X(i,3),'*','Color',color(Idx(i),:))
hold on
end
title('三维聚类')
plot3(C(:,1),C(:,2),C(:,3),'ro')%绘制聚类中心
xlabel('x')
ylabel('y')
zlabel('z')
elseif N==1%一维图像
color=rand(k,3);%随机生成k种颜色
Y=zeros(size(X));
for i =1:M
plot(X(i),Y,'*','Color',color(Idx(i),:))
end
plot(C(:),Y,'o')%绘制聚类中心
end
end
主函数测试
figure(1)
%%三维聚类
X = rand(100,2);
c=3;
[Idx,C,D]=my_kmeans(X,c)
MyPlot(X,c,C,Idx)
figure(2)
%%三维聚类
X = rand(100,3);
c=3;
[Idx,C,D]=my_kmeans(X,c)
MyPlot(X,c,C,Idx)
运行结果