📄 k_means.m
字号:
clear all;
load iris_tr;
load iris_te;
H=1;
% m为要生成的族的数目
m=3;
% num(n)为第n类的记录条数
for n=1:m
num(n)=0;
end
[rows,cols]=size(IRIS_training_data);
for I=1:rows
if IRIS_training_data(I,6)==1
IRIS_training_data(I,5)=2;
end
if IRIS_training_data(I,7)==1
IRIS_training_data(I,5)=3;
end
end
new_iris=IRIS_training_data(:,1:5);
% 对test进行观察式学习分类
test=IRIS_training_data(:,1:4);
%随机选择三条连续记录作为初始的三个类
for I=1:m
c(I)=floor(rand(1)*75)+1;
end
for J=1:m
for I=1:4
class{J}(I)=test(c(J),I);
end
end
while H==1
for I=1:rows
for K=1:m
d(K)=sqrt((class{K}(1)-test(I,1))^2+(class{K}(2)-test(I,2))^2+(class{K}(3)-test(I,3))^2+(class{K}(4)-test(I,4))^2);
end
[y,t]=min(d);
num(t)=num(t)+1;
test(I,5)=t;
for J=1:4
last_class{t}=class{t};
class{t}(J)=(test(I,J)+class{t}(J)*num(t))/(num(t)+1);
end
end
% 判断结束条件是否满足
for K=1:m
d(K)=sqrt((last_class{K}(1)-class{K}(1))^2+(last_class{K}(2)-class{K}(2))^2+(last_class{K}(3)-class{K}(3))^2+(last_class{K}(4)-class{K}(4))^2);
end
[y,t]=max(d);
if y<0.0001;
break;
end
end
% 与实际的分类对比计算出预测的正确率
for I=1:m
class11(I)=0;
class21(I)=0;
class31(I)=0;
end
for I=1:3:rows
if test(I,5)==1
class11(1)=class11(1)+1;
elseif test(I,5)==2
class11(2)=class11(2)+1;
else class11(3)=class11(3)+1;
end
[right_num,t]=max(class11);
end
for I=2:3:rows
if test(I,5)==1
class21(1)=class21(1)+1;
elseif test(I,5)==2
class21(2)=class21(2)+1;
else class21(3)=class21(3)+1;
end
end
right_num=right_num+max(class21);
for I=3:3:rows
if test(I,5)==1
class31(1)=class31(1)+1;
elseif test(I,5)==2
class31(2)=class31(2)+1;
else class31(3)=class31(3)+1;
end
end
right_num=right_num+max(class31);
right_num=(right_num/rows)*100;
disp(sprintf('利用k_means给iris数据集分类的正确率为:%d%%',right_num));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -