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

📄 leinei_new2.m

📁 聚类算法,绝对值距离且比雪夫距离平均值距离等.matlab程序,GUI界面,有详细说明
💻 M
字号:
function leinei_new2(train_file,cha_num,lei_num)      %train_file 是打开的输入文件名 lie_num是类数

train=train_file(:,1:(2+cha_num));
%train=xlsread(train_file);

yang_num=size(train,1);

%########################### 一、准备工作 ##############################

%初始化聚类,第一维与第二维记录样本特征,第三维记录类别号,初始化时共60个类别
for ii=1:yang_num
    julei(1,:,ii)=train(ii,:);
    for jj=2:yang_num
        julei(jj,:,ii)=0;
    end    
end

%%%%%%%%%%%%%%%%%% 初始化聚类结束 %%%%%%%%%%%%%%%%%%%%%%%%

% dd用于存放任意两个类中各个样本间的距离
dd=9999; 

%%%%%%%%%%%%%%%%%%%%%%%%% 初始化距离矩阵 %%%%%%%%%%%%%%%%%%%%%%%%%%%%   
% d矩阵中存放所有各个样本间的距离,如第一行第二列,是第一类到第二类的距离
% 对角线及对角线以下的无用,全部置为9999,那么选择类与类的距离的时候便不会选到他们    
d=ones(yang_num,yang_num);
for ii=1:yang_num
    for jj=1:yang_num
        d(ii,jj)=9999;
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%% 初始化距离矩阵结束 %%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%   有效聚类数      %%%%%%%%%%%%%%%%%%%%%%%%
%有效聚类是指内容不为空的类,比如第一类与第二类合并后,将第二类的样本放入第一类
%而将第二类清零,此时第二类为无效聚类。
n=0;
for ii=1:yang_num
    if julei(1,1,ii)~=0
        n=n+1;
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 准备工作结束 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%############################ 二、开始聚类——第一次 ###############################
    
while n~=lei_num
    %算距离
    for ii=1:yang_num
        for jj=1:yang_num
            if julei(1,1,ii)~=0&julei(1,1,jj)~=0&ii<jj
                num1=0;num2=0;
                for mm=1:yang_num
                    if julei(mm,1,ii)~=0
                        num1=num1+1;
                    end
                    if julei(mm,1,jj)~=0
                        num2=num2+1;
                    end                        
                end
                lei=[julei(1:num1,3:(2+cha_num),ii);julei(1:num2,3:(2+cha_num),jj)];
                ju=pdist(lei);
                juli=sum(ju);
                d(ii,jj)=juli/nchoosek(num1+num2,2);
                
            end 
            dd=zeros(1);
            dd=9999;
        end
    end

    
    %合并
    for ii=1:yang_num
        for jj=1:yang_num
            if d(ii,jj)==min(min(d))
                ii;
                jj;
                num1=0;num2=0;
                for mm=1:yang_num
                    if julei(mm,1,ii)~=0
                        num1=num1+1;
                    end
                    if julei(mm,1,jj)~=0
                        num2=num2+1;
                    end                        
                end
                number=1;
                for nn=(num1+1):(num1+num2)
                    julei(nn,:,ii)=julei(number,:,jj);
                    number=number+1;
                end
                julei(:,:,jj)=0;
            end
        end
    end

    
    for ii=1:yang_num
        for jj=1:yang_num
            d(ii,jj)=9999;
        end
    end

    n=0;
    for ii=1:yang_num
        if julei(1,1,ii)~=0
            n=n+1;
        end
    end 
    
end
%#############################              ###############################
%############################# 聚类全部结束  ###############################

%############################  三、后期处理 ############################
%%############################  三、后期处理 ############################
%挑出有效类
a=1;
for ii=1:yang_num
    
        if julei(1,1,ii)~=0
            num1=0;
                for mm=1:yang_num
                    if julei(mm,1,ii)~=0
                        num1=num1+1;
                    end                                       
                end
            Final_ju(1:num1,:,a)=[julei(1:num1,:,ii)];
            a=a+1;
            
        end
    
end



disp('聚类结果')
Final_ju

aa=size(Final_ju,1);
%当只有三个类的时候
%区聚类所属并计算模板
if lei_num==3
    num1=0;num2=0;num3=0;
    for ii=1:aa
        if Final_ju(ii,1,1)~=0
            num1=num1+1;
        end
        if Final_ju(ii,1,2)~=0
            num2=num2+1;
        end
        if Final_ju(ii,1,3)~=0
            num3=num3+1;
        end
    end
    lei_1_1=0;lei_1_2=0;lei_1_3=0;
    lei_2_1=0;lei_2_2=0;lei_2_3=0;
    lei_3_1=0;lei_3_2=0;lei_3_3=0;
    for ii=1:aa
        switch Final_ju(ii,2,1)
            case 1
                lei_1_1=lei_1_1+1;
            case 2
                lei_1_2=lei_1_2+1;
            case 3
                lei_1_3=lei_1_3+1;
        end
        if lei_1_1>lei_1_2&lei_1_1>lei_1_3
            lei_1=Final_ju(1:num1,:,1);
        end
        if lei_1_2>lei_1_1&lei_1_2>lei_1_3
            lei_2=Final_ju(1:num1,:,1);
        end
        if lei_1_3>lei_1_2&lei_1_3>lei_1_1
            lei_3=Final_ju(1:num1,:,1);
        end
        
        switch Final_ju(ii,2,2)
            case 1
                lei_2_1=lei_2_1+1;
            case 2
                lei_2_2=lei_2_2+1;
            case 3
                lei_2_3=lei_2_3+1;
        end
        if lei_2_1>lei_2_2&lei_2_1>lei_2_3
            lei_1=Final_ju(1:num2,:,2);
        end
        if lei_2_2>lei_2_1&lei_2_2>lei_2_3
            lei_2=Final_ju(1:num2,:,2);
        end
        if lei_2_3>lei_2_2&lei_2_3>lei_2_1
            lei_3=Final_ju(1:num2,:,2);
        end
        
        switch Final_ju(ii,2,3)
            case 1
                lei_3_1=lei_3_1+1;
            case 2
                lei_3_2=lei_3_2+1;
            case 3
                lei_3_3=lei_3_3+1;
        end
        if lei_3_1>lei_3_2&lei_3_1>lei_3_3
            lei_1=Final_ju(1:num3,:,3);
        end
        if lei_3_2>lei_3_1&lei_3_2>lei_3_3
            lei_2=Final_ju(1:num3,:,3);
        end
        if lei_3_3>lei_3_2&lei_3_3>lei_3_1
            lei_3=Final_ju(1:num3,:,3);
        end
    end
    lei_1
    lei_2
    lei_3
    
    
end
    
if lei_num==3&(cha_num>3|cha_num==3)    
figure
colordef black;
plot3(lei_1(:,3),lei_1(:,4),lei_1(:,5),'r*',lei_2(:,3),lei_2(:,4),lei_2(:,5),'y*',lei_3(:,3),lei_3(:,4),lei_3(:,5),'g*')
title('聚类后各类前三特征三维视图');
%plot3(Final_ju(1:num1,3,1),Final_ju(1:num1,4,1),Final_ju(1:num1,5,1),'r*',Final_ju(1:num2,3,2),Final_ju(1:num2,4,2),Final_ju(1:num2,4,2),'m*',Final_ju(1:num3,3,3),Final_ju(1:num3,4,3),Final_ju(1:num3,5,3),'g*')
grid
end

⌨️ 快捷键说明

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