📄 kmeans.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 + -