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

📄 k_medoids.m

📁 聚类算法:k—medoids 方法。这儿选取一个对象叫做mediod来代替上面的中心 的作用
💻 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 + -