📄 k_medoids.m
字号:
clear all;
load iris_tr;
load iris_te;
H=1;
% m为要生成的族的数目
m=3;
% num(n)为第n类的记录条数
for n=1:m
num(n)=0;
last_distance(n)=0;
new_distance(n)=0;
last_class{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
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;
end
while H==1
new_center=floor(rand(1)*75)+1;
for K=1:m
for I=1:rows
if test(I,5)==K
last_distance(K)=last_distance(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
rand_num=floor(rand(1)*75)+1;
if test(I,t)==K
new_distance(K)=new_distance(K)+sqrt((test(rand_num,1)-test(I,1))^2+(test(rand_num,2)-test(I,2))^2+(test(rand_num,3)-test(I,3))^2+(test(rand_num,4)-test(I,4))^2);
end
end
end
for K=1:m
if new_distance(K)<last_distance(K)
for I=1:4
last_class{K}=class{K};
class{K}(I)=test(rand_num,I);
end
end
end
% 判断结束条件是否满足
for K=1:m
d(K)=sqrt((last_class{t}(1)-class{t}(1))^2+(last_class{t}(2)-class{t}(2))^2+(last_class{t}(3)-class{t}(3))^2+(last_class{t}(4)-class{t}(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_medoids给iris数据集分类的正确率为:%d%%',right_num));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -