• 大小: 6KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-17
  • 语言: Matlab
  • 标签: ISODATA  

资源简介

ISODATA算法的实现,使用matlab编程,聚类文件为男女身高和体重,最后结果聚类为两类,一类男,一类女

资源截图

代码片段和文件信息

function group=ISODATA(kleastNumclassStandardminDismaxCombineiterationTime)
%ISODATA聚类算法
%k预期的聚类中心数目
%leastNum每一聚类域中最少的样本数目
%classStandard一个聚类域中样本距离分布的标准差
%minDis两个聚类中心间的最小距离
%maxCombine在一次迭代运算中可以合并的聚类中心的最多对数
%iterationTime迭代运算的次数
person=load(‘sample.txt‘‘height‘‘weight‘);%从文本文件读入数据放入person结构体中
num=size(person1);%获得person结构体大小
currentNum=1;%当前聚类中心的数目即当前分类的数目
centre=person(1:);%初始聚类中心
% centre(2:)=person(50:);
% centre(3:)=person(100:);
% centre(4:)=person(150:);
factor = 0.5;   %分裂计算时标准差的乘积因子
distance=ComputDistance(personcentrenumcurrentNum);%计算每个样本跟各类中心的距离
I=1;

while I<=iterationTime    
    class=cell(currentNum);
    for i=1:num
        [valueindex]=min(distance(i:)); %找到每个样本距离哪个类最近
        dtemp=[i];
        class{index}=[class{index}dtemp];  %将该样本划分到距离最近的类中
    end
    
    %若某类样本数小于每类最少样本数则取消该分类
    for i=1:currentNum
        if size(class{i}2)            class=move(classi);
            currentNum=currentNum-1;
        end
    end
    centre=ComputMid(personclasscurrentNum);%重新计算各类中心点
    distance=ComputDistance(personcentrenumcurrentNum);%重新计算各样本与各类的距离  
    classAverage=ComputAverageClass(classdistancecurrentNum);%计算各聚类域Sj中模式样本与各聚类中心间的平均距离classAverage
    totalAverage=ComputAverageTotal(classclassAveragecurrentNumnum);%计算全部模式样本和其对应聚类中心的总平均距离totalAverage
    flag=step_judge(currentNumIiterationTimek);
    
    if flag==1%分裂处理
        Cstandard=ComputCstandard(classpersoncentrecurrentNum);%计算每个聚类中样本距离的标准差向量Cstandard
        for i=1:currentNum
            [valueindex]=max(Cstandard(i:));
            maxCstandard(i)=value;
            if maxCstandard(i)>classStandard
                if (classAverage(i)>totalAverage && size(class{i}2)>2*(leastNum+1))||currentNum<=k/2%样本总数超过规定值一倍以上,分裂聚类中心
                    lcentre=centre(i:)-factor*maxCstandard(i);
                    hcentre=centre(i:)+factor*maxCstandard(i); 
                    temp=centre((i+1):currentNum:);
                    currentNum=currentNum+1;
                    centre(i:)=lcentre;
                    centre(i+1:)=hcentre;
                    centre((i+2):currentNum:)=temp;                  
                end
            end
        end
    
    elseif flag==0 %合并处理
        if I==iterationTime %最后一次迭代
            minDis=0;
        end
        centreDis=ComputCentreDistance(centrecurrentNum);%计算全部聚类中心的距离centreDis
        [indrow indcol] = find(centreDis        [indrow indcol]=selectsort(centreDisindrowindcol);
        for i=1:size(indrow1)            
            if i<=maxCombine
                lengthI=size(class{indrow(i)}2);
                lengthJ=size(class{indcol(i)}2);
                tempCentre(i:)=(1/(lengthI+lengthJ))*(lengthI*centre(indrow(i):)+lengthJ*centre(indcol(i):));
                if indrow(i)                    centre(indrow(i):)=tempCentre(i:);
                    temp=centre((i

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6998  2011-06-04 16:56  ISODATA\sample.txt

     文件       7627  2011-03-27 11:11  ISODATA\ISODATA.m

     目录          0  2011-06-04 16:57  ISODATA

----------- ---------  ---------- -----  ----

                14625                    3


评论

共有 条评论