Kmeans聚类的实现一

        Kmeans聚类的基本思想:首先,随机地选择k个对象,每个对象代表一个簇的初始均值或中心。对于剩余的每个元素,根据其与各个簇均值的距离,将它指派到最相似的簇。然后计算每个簇的新均值。这个过程不断重复,直到准则函数收敛。数学原理:最小平方误差准则。

        使用matlab中自带的Kmeans工具箱以及IRIS数据集进行实验。

        实验结果:聚类:88%;分类:80%;

源码:

clear;
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)
%组成训练样本(90*4)train=data(1:150,1:4);
[Idx,C]=kmeans(train,3,'dist','sqEuclidean','rep',50);
col=size(Idx,1);
s1=size(find(Idx==1),1);
s2=size(find(Idx==2),1);
s3=size(find(Idx==3),1);
sum=abs(s1-30)+abs(s2-30)+abs(s2-30);%错分的样本数目
p=(150-sum)/150;%有效分类的概率
disp(['聚类正确率为',num2str(p)]);
y=[];B=[];
k=1;
for j=1:3

    I=Idx((j*30-29):j*30,:);
    w=unique(I);
    max=1;
    for i=1:size(w,1)
        y(i)=size(find(I==w(i)),1);
        if(y(i)>max)
            B(k)=w(i);
        end
    end
    k=k+1;
end
sum=0;
[u,v]=size(test);%返回测试样本行列,u=60,v=4
test1=[];test2=[];test3=[];m1=1;m2=1;m3=1;
k=1;
for x=1:u
    d1=pdist([test(x,:);C(1,:)]);%测试样本与聚类中心z1的距离
    d2=pdist([test(x,:);C(2,:)]);%测试样本与聚类中心z2的距离
    d3=pdist([test(x,:);C(3,:)]);%测试样本与聚类中心z3的距离
    if d1<d2&&d1<d3%若d1最小则测试样本赋值于test1
        test1(m1,:)=test(x,:);
        D(k)=1;k=k+1;
    elseif d2<d1&&d2<d3%若d2最小则测试样本赋值于test2
        test2(m2,:)=test(x,:);
        D(k)=2;k=k+1;
    else test3(m3,:)=test(x,:);%若d3最小则测试样本赋值于test3
        D(k)=3;k=k+1;
    end%分类结果为test1(20*4),test2(25*4),test3(15*4)共60组
end 
s1=size(find(D==1),2);
s2=size(find(D==2),2);
s3=size(find(D==3),2);
sum=abs(s1-20)+abs(s2-20)+abs(s2-20);%错分的样本数目
disp(sprintf('分类正确率为%4.2f',(60-sum)/60));%正确率

你可能感兴趣的:(Kmeans聚类的实现一)