📄 isodata.m
字号:
%ISODATA算法的Matlab程序 Design by shuijian (shuijian1122@gmail.com)
%相关函数说明见函数定义
%x=样本空间
%clusterNumber=预期聚类中心数目
%leastNumber=最小聚类中的样本数,少于此数将不能作为独立的样本
%stdvar=样本距离分布的标准差
%minmumDistance=两聚类中心的最小距离,小于此数将两个聚类合并
%maximumCluster=一次运算中可以合并的聚类中心的最大对数
%opCount=跌代运算次数
%n=x中元素个数
%number=x中元素特征数目
%s=聚类结果
%clusterCenter=聚类中心
%clusterCount = 聚类中心元素数目
function [s,clusterCenter,clusterCount] = ISODATA(x,n,number,clusterNumber,leastNumber,stdvar,minmumDistance,maximumCluster,opCount)
K = clusterNumber;
qn = leastNumber;
qs = stdvar;
qc = minmumDistance;
L = maximumCluster;
I = opCount;
num = number;
factor = 0.5; %分裂计算时标准差的乘积因子
% z = [x(2,:);x(floor(n/3),:);x(n,:)]; %初始聚类中心,随机选择,z=聚类中心
z = x(2,:);
nc = 1;%初始聚类数目
opTimes = 1; %跌代运算次数计数器
while(opTimes < I)
count = zeros(1,nc); %聚类元素数目
disTocenter = zeros(n,nc);
ss = zeros(nc,n);
%依据欧氏距离聚类
for m = 1:n
for p = 1:nc
disTocenter(m,p) = distance(x(m,:),z(p,:),num); %计算各个元素距离各个中心之间的距离
end
[minValue,index] = min(disTocenter(m,:)); %依据距离归类
count(index) = count(index) + 1;
ss(index,m) = m;
end
%修正聚类中心,计算元素到中心的平均距离
for i = 1:nc
[aveD(i),z(i,:)] = avTocenter(x(find(ss(i,:)),:),count(i),num);
end
%计算全部模式样本对应聚类中心的总的平均距离。
aveAllD = allAvDis(aveD,count);
bool = step_judge(opTimes,nc,I,L); %判断是进行分裂还是合并运算
nct = nc;
if (bool == 1) %分裂计算(正确)
for i = 1:nc
stdcluster(i,:) = clusterStd(x(find(ss(i,:)),:),z(i,:),count(i),num);
%计算每个聚类中样本距离的标准差向量
[maxQs(i),ind] = max(stdcluster(i)); %求每聚类中标准差最大分量
if(maxQs(i) > qs && (((aveD(i) > aveAllD) && count(i) > 2 * (qn+1)) || nc <= K/2)) %满足条件,分裂聚类中心
lqs =z(i,ind) + factor * maxQs(i);
hqs = z(i,ind) - factor * maxQs(i);
temp=[z;z(i,:)];
temp(nc+1,ind) = lqs;
temp(i,ind) = hqs;
z = temp;
nct = nct + 1;
end
end
nc = nct;
elseif (bool == 0) %合并
centerD = centerDistance(z,nc,num);
Zij = centerD < qc; %查找小于设定最小中心距离的中心
[indrow indcol] = find(Zij); %查找两个中心点
%indrowcol = [indrow indcol];
for icount = 1:ceil(numel(indrow)/2) %对称矩阵,只计算一半即可
if(indrow(icount) == indcol(icount)) %去掉自身距离(为0)
continue;
else
newCenter = count(indrow(icount))*z(indrow(icount),:) + count(indcol(icount))*z(indcol(icount),:);
newCenter = newCenter ./(count(indrow(icount))+count(indcol(icount))); %计算合并后的新的中心
for zcount = 1:nc
centerTemp(zcount,:) = z(zcount,:); %缓存聚类中心
end
z = zeros(nc-1,num);
for zcount = 1:nc-1
if(zcount == indrow(icount) || zcount == indcol(icount))
z(zcount,:) = newCenter;
else
z(zcount,:) = centerTemp(zcount,:);
end
end
nc = nc - 1; %合并,减少聚类中心数目
end
end
else
qc = 0;
end
opTimes = opTimes + 1;
end
s = ss;
clusterCenter = z;
clusterCount = count;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -