文档视界 最新最全的文档下载
当前位置:文档视界 › K_均值聚类算法

K_均值聚类算法

以下是K均值聚类算法在Matlab中的实现
data=input('请输入样本数据矩阵:');
m=size(data,1);
n=size(data,2);
counter=0;
k=input('请输入聚类数目:');
while k>m
disp('您输入的聚类数目过大,请输入正确的k值');
k=input('请输入聚类数目:');
end
if k==1
disp('聚类数目不能为1,请输入正确的k值');
k=input('请输入聚类数目:');
end
%产生k个零矩阵,M用来存放聚类中心
M=cell(1,m);
for i=1:k
M{1,i}=zeros(1,n);
end
Mold=cell(1,m);
for i=1:k
Mold{1,i}=zeros(1,n);
end
%随机选取k个样本作为初始聚类中心
%第一次聚类,使用初始聚类中心
p=randperm(m);%产生m个不同的随机数
for i=1:k
M{1,i}=data(p(i),:);
end
while true
counter=counter+1;
disp('第');
disp(counter);
disp('次迭代');
count=zeros(1,k);
%初始化聚类C
C=cell(1,k);
for i=1:k
C{1,i}=zeros(m,n);
end
%聚类
for i=1:m
gap=zeros(1,k);
for d=1:k
for j=1:n
gap(d)=gap(d)+(M{1,d}(j)-data(i,j))^2;
end
end
[y,l]=min(sqrt(gap));
count(l)=count(l)+1;
C{1,l}(count(l),:)=data(i,:);
end

Mold=M;
disp('聚类中心为:');
for i=1:k
disp(M{1,i});
end
disp('聚类结果为:');
for i=1:k
disp(C{1,i});
end
sumvar=0;
for i=1:k
E=0;
disp('单个误差平方和为:');
for j=1:count(i)
for h=1:n
E=E+(M{1,i}(h)-C{1,i}(j,h))^2;
end
end
disp(E);
sumvar=sumvar+E;
end
disp('总体误差平方和为:');
disp(sumvar);
%计算新的聚类中心,更新M,并保存旧的聚类中心
for i=1:k
M{1,i}=sum(C{1,i})/count(i);
end
%检查前后两次聚类中心是否变化,若变化则继续迭代;否则算法停止;
tally=0;
for i=1:k
if abs(Mold{1,i}-M{1,i})<1e-5*ones(1,n)
tally=tally+1;
continue;
else
break;
end
end
if tally==k
break;
end
end

相关文档