资源简介
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
- 上一篇:MNF算法流程
- 下一篇:PCA-SIFT 源代码 matlab
评论
共有 条评论