load data.txt;
a=data(1:30,1:4);%取第一类的前三十组
aa=data(31:50,1:4);%第一类的后二十组
b=data(51:80,1:4);%第二类的前三十组
bb=data(81:100,1:4);%第二类的后二十组
c=data(101:130,1:4);%取第三类的前三十组
cc=data(131:150,1:4); %第三类的后二十组
train=cat(1,a,b,c);%组成训练样本(90*4)
test=cat(1,aa,bb,cc);%组成测试样本(60*4)
c=3;%c均值c=3
z1=train(1,:); %取第1行,作为1中心
z2=train(45,:);%取第45行,作为2中心
z3=train(90,:); %取第90行,作为3中心,初始聚类中心z1,z2,z3
m=0;t=0;%迭代步数
while m==0
samp1=[];samp2=[];samp3=[]; %定义空样本:第一类为samp1,第二类为samp2,第三类为samp3
n1=1;n2=1;n3=1;
t=t+1;
for i=1:90
if (pdist([train(i,:);z1])<pdist([train(i,:);z2]))&&(pdist([train(i,:);z1])<pdist([train(i,:);z3]))%距离
%pdist(X)行行距离
%若训练样本与聚类z1的距离小于与z2,z3的距离,则赋值于samp1.
samp1(n1,:)=train(i,:);
n1=n1+1;
elseif (pdist([train(i,:);z2])<pdist([train(i,:);z1]))&&(pdist([train(i,:);z2])<pdist([train(i,:);z3]))
%若训练样本与聚类z2的距离小于与z1,z3的距离,则赋值于samp2.
samp2(n2,:)=train(i,:);
n2=n2+1;
else%其他则赋值于samp3
samp3(n3,:)=train(i,:);
n3=n3+1;
end
end %for
c1=mean(samp1,1);
c2=mean(samp2,1);
c3=mean(samp3,1); %求出新的均值,产生新的聚类中心
if isequal(c1,z1)&&isequal(c2,z2)&&isequal(c3,z3) %判断新旧聚类中心是否相等。若相等则结束m=1
m=1;
end
z1=c1; %新旧聚类中心若不相等,新聚类中心赋值于旧聚类中心。继续循环
z2=c2;
z3=c3;
end %while
%%聚类中心z1=[5.0267 3.45 1.4733 0.24667],z2=[5.9703 2.7459 4.44051.4676],z3=[6.9 3.0478 5.8174 2.0217]
%%kmeans算法结束后分三类samp1(30*4),samp2(37*4),samp3(23*4)共90行,迭代次数t=5
sum=0;
[u,v]=size(test);%返回测试样本行列,u=60,v=4
test1=[];test2=[];test3=[];m1=1;m2=1;m3=1;
for x=1:u
d1=pdist([test(x,:);z1]);%测试样本与聚类中心z1的距离
d2=pdist([test(x,:);z2]);%测试样本与聚类中心z2的距离
d3=pdist([test(x,:);z3]);%测试样本与聚类中心z3的距离
if d1<d2&&d1<d3%若d1最小则测试样本赋值于test1
test1(m1,:)=test(x,:);
m1=m1+1;m=1;
elseif d2<d1&&d2<d3%若d2最小则测试样本赋值于test2
test2(m2,:)=test(x,:);
m2=m2+1;m=2;
else test3(m3,:)=test(x,:);%若d3最小则测试样本赋值于test3
m3=m3+1;m=3;
end%分类结果为test1(20*4),test2(25*4),test3(15*4)共60组
if x<=20
disp(sprintf('第%d组数据分类后为第%d类',x+30,m));
elseif x>20&&x<=40
disp(sprintf('第%d组数据分类后为第%d类',x+60,m));
elseif x>40&&x<=60
disp(sprintf('第%d组数据分类后为第%d类',x+90,m));
end
if (x<=20&&m==1)||(x>20&&x<=40&&m==2)||(x>40&&x<=60&&m==3)
sum=sum+1; %正确的个数
end
end
disp(sprintf('分类正确率为%4.2f',sum/60));%正确率load data.txt;
a=data(1:30,1:4);%取第一类的前三十组
aa=