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

📄 isodata.asv

📁 ISODATA算法
💻 ASV
字号:
%******************************************************************
function Classes=ISODATA(Patterns,c,Nc,Selta_n,Selta_s,Selta_D,L,I)
%@project:ISODATA算法
%@author:fantasy
%@date:2006.5.4

%@parameter:
%    Patterns:输入模式集
%    c:预期类数
%    Nc:初始聚类中心个数
%    Selta_n:每类中允许的最少模式数目
%    Selta_s:类中各分量分布的标准差上限
%    Selta_D:两类中心间的最小距离下限
%    L:在每次迭代中可以合并的类的最多对数
%    I:允许的最多迭代次数

%@return:
%    Classes:输出类集

Dim=size(Patterns,1);%模式维数
N=size(Patterns,2);%总的模式数目

bPartition=0;%分裂条件
bCombine=0;%合并条件

Classes=[];
%初始化聚类
for iPattern=1:Nc
    p=Classf(Patterns(:,iPattern));
    Classes=[Classes,p];
end

iStep=0;%迭代步数
while iStep<I
    %**************************************************************
    %按最小距离原则分类
    for iPattern=1:N
        dMin=getDistance(Classes(1),Patterns(:,iPattern));%最小距离
        iClassMin=1;%最小距离对应之类别
        for iClass=2:length(Classes)
            d=getDistance(Classes(iClass),Patterns(:,iPattern));
            if dMin>d
                dMin=d;
                iClassMin=iClass;
            end
        end
        Classes(iClassMin)=addPattern(Classes(iClassMin),Patterns(:,iPattern));
    end
    %**************************************************************
    
    %**************************************************************
    %依Selta_n判断合并
    for iClass=1:length(Classes)
        if getSize(Classes(iClass))<Selta_n
            Classes(iClass)=[];
            bCombine=1;
            break;
        end
    end
    
    if bCombine==1
        Nc=Nc-1;
        break;
    end
    %**************************************************************

    %计算各类中模式到类心的平均距离
    d=[];
    d_mean=0.0;%总的平均距离
    
    for iClass=1:Nc
        d_mean=getMeanDistance(Classes(iClass));%d_mean当作临时变量
        d=[d,d_mean];
        d_mean=d_mean*getSize(Classes(iClass));
    end
    d_mean=d/N;
    %*************************************************************
    
    %*************************************************************
    if (iStep~=I)&&(Nc<=c/2||(Nc>c/2&&Nc<2*c&&(mod(iStep,2)==0)))
        %**********************************************************
        %分裂处理
        for iClass=1:Nc
            delta=getStdVector(Classes(iClass));
            [delta_max,index]=max(delta);
            if (delta_max>Selta_s)&&((d(iClass)>d_mean&&getSize(Classes(iClass))>2*(Selta_n+1))||Nc<=c/2)
                bPartition=1;
                break;
            end
        end
    end
    
    %分裂
    k=0.5;
    if 1==bPartition
        centerPattern=getCenter(Classes(iClass));
        Classes(iClass)=[];
        Nc=Nc+1;
        centerPatternPlus=centerPattern;
        centerPatternPlus(index)=centerPattern(index)+k*delta_max;
        centerPatternMinus=centerPattern;
        centerPatternMinus(index)=centerPattern(index)-k*delta_max;

        p=Classf(centerPatternPlus);
        Classes=[Classes,p];
        p=Classf(centerPatternMinus);
        Classes=[Classes,p];
        iStep=iStep+1;
        break;
    end
   
    %*************************************************************
    %合并处理
    if iStep==I
        Selta_D=0;
    end
    
    %计算各类对中心间的距离
    d=getDistance(Classes(1),getCenter(Classes(2)));
    i=1;
    j=2;
    for iClass=1:Nc-1
        for jClass=iClass+1:Nc
           d_ij=getDistance(Classes(iClass),getCenter(Classes(jClass)));
           if d>d_ij
              d=d_ij;
              i=iClass;
              j=jClass;
           end
               
        end
    end
    
    %合并
    if d_ij>Selta_D
        iStep=iStep+1;
    end
    
    iCenter=getCenter(Classes(i));
    jCenter=getCenter(Classes(j));
    
    Ni=getSize(Classes(i));
    Nj=getSize(Classes(j));
    
    newCenter=(iCenter*Ni+jCenter*Nj)/(Ni+Nj);
    Classes(i)=[];
    Classes(j)=[];
    p=Classf(newCenter);
    Classes=[Classes,p];
    Nc=Nc-1;
    iStep=iStep+1;       
    
end

⌨️ 快捷键说明

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