⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmeans.m

📁 k-means算法 自定义数据样本和类中心 已经调试实现 并且有图清晰表示
💻 M
字号:
clear all;
close all;
Data=[ -7.82 -4.58 -3.97
       -6.68 3.16 2.71
       4.36 -2.19 2.09
       6.72 0.88 2.80
       -8.64 3.06 3.50
       -6.87 0.57 -5.45
       4.47 -2.62 5.76
       6.73 -2.01 4.18
       -7.71 2.34 -6.33
       -6.91 -0.49 -5.68
       6.18 2.81 5.82
       6.72 -0.93 -4.04
       -6.25 -0.26 0.56
       -6.94 -1.22 1.13
       8.09 0.20 2.25
       6.81 0.17 -4.15
       -5.19 4.24 4.04
       -6.38 -1.74 1.43
       4.08 1.30 5.33
       6.27 0.93 -2.78];                     %样本

m1=[0,0,0];                                  %定义初始聚类中心
m2=[1,1,-1];
key=1                                        %记录迭代次数
w=0;

while w==0
    k1=0;k2=0;
    D1=[0 0 0]; D2=[0 0 0]; 
    for i=1:20
        t1(i,:)=Data(i,:)-m1;
        t2(i,:)=Data(i,:)-m2;
        p1=t1(i,:);
        p2=t2(i,:);
        d1(i)=sqrt(sum(p1.*p1));            %第i点到m1的距离
        d2(i)=sqrt(sum(p2.*p2));            %第i点到m2的距离
     if d1(i)<d2(i)                         %判断第i点到m1近还是m2近,并归入第一或第二类
            D1=D1+Data(i,:); k1=k1+1; a(i)=0;       %a(i)作为识别不同类的标识,为0时是第一组,为1时是第二组
     else
            D2=D2+Data(i,:); k2=k2+1; a(i)=1;
     end
    end
     D1=D1/k1;                             %计算新分类后每类的均值
     D2=D2/k2;
     if m1==D1 & m2==D2                    %当聚类中心不在变化时,跳出while循环
         w=1;
        break; 
     else                                  %当聚类中心仍在变化时,继续循环迭代
           m1=D1;
           m2=D2;
           key=key+1
     end
end

q=1;w=1;                                    %将分开的两类点放入两个集合中,以不同的颜色点输出
for i=1:20
   if a(i)==0
       Data1(q,:)=Data(i,:);q=q+1;
   else
       Data2(w,:)=Data(i,:);w=w+1;
   end
end
Data1
Data2
x1=Data1(:,1);
y1=Data1(:,2);
z1=Data1(:,3);
x2=Data2(:,1);
y2=Data2(:,2);
z2=Data2(:,3);
plot3(x1,y1,z1,'.c',x2,y2,z2,'.r')
xlabel('x值')
ylabel('Y值') 
zlabel('Z值')
        


    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -