matlab模糊聚类算法进行图像分割的源程序.doc
《matlab模糊聚类算法进行图像分割的源程序.doc》由会员分享,可在线阅读,更多相关《matlab模糊聚类算法进行图像分割的源程序.doc(4页珍藏版)》请在冰豆网上搜索。
%%%%%%%%%%%%%%%模糊聚类%%%%%%%%%%%%%%%%%%%%%%%
clear;
loadF:
\从0开始\数据\data.txt;
INPUTDATA=data;
%--------原始数据标准化-------%
disp('请选择原始数据标准化方式:
');
disp('<1-总和标准化|2-标准差标准化|3-极大值标准化|4-极差标准化>');
wayforstand=input('请输入:
');
switchwayforstand
case1,
DATAFORCLUS=standard_use_sum(INPUTDATA);
case2,
DATAFORCLUS=standard_use_std(INPUTDATA);
case3,
DATAFORCLUS=standard_use_max(INPUTDATA);
case4,
DATAFORCLUS=standard_use_jc(INPUTDATA);
otherwise
error('您的输入不符合要求->执行结束!
!
!
');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%基于模糊等价关系的模糊聚类%%%%%%%%%%%%%%%%%%%%%%
%----------构造相似关系-----------%
numrows=size(DATAFORCLUS,1);
numcols=size(DATAFORCLUS,2);
disp('请选择对象之间相似性统计量的方式:
');
disp('<1-相关系数法|2-夹角余弦法|3-指数相似系数法|4-绝对值指数法|5-算术平均最小法|6-最大最小值法|7-绝对值差数法|8-数量积法>');
wayforr_ij=input('请输入:
');
switchwayforr_ij
case1,%-----------------------------------相关系数法
fori=1:
numrows,
forj=1:
numrows,
meani=mean(DATAFORCLUS(i,:
));meanj=mean(DATAFORCLUS(j,:
));
simiR(i,j)=sum((DATAFORCLUS(i,:
)-meani).*(DATAFORCLUS(j,:
)-meanj))/...
(sqrt(sum((DATAFORCLUS(i,:
)-meani).^2))*sqrt(sum((DATAFORCLUS(j,:
)-meanj).^2)));
end
end
case2,%-----------------------------------夹角余弦法
fori=1:
numrows,
forj=1:
numrows,
simiR(i,j)=sum(DATAFORCLUS(i,:
).*DATAFORCLUS(j,:
))/...
(sqrt(sum(DATAFORCLUS(i,:
).*DATAFORCLUS(i,:
)))*sqrt(sum(DATAFORCLUS(j,:
).*DATAFORCLUS(j,:
))));
end
end
case3,%-----------------------------------指数相似系数法
case4,%-----------------------------------绝对值指数法
case5,%-----------------------------------算术平均最小法
case6,%-----------------------------------最大最小值法
case7,%-----------------------------------绝对值差数法
case8,%-----------------------------------数量积法
otherwise
error('您的输入不符合要求->执行结束!
!
!
');
end
%-------改造成等价关系----------%
sign=0;
numselfmul=1;
simiRk=eye(numrows);
equi_tem=simiR;
whilesign==0,
fori=1:
numrows,
forj=1:
numrows,
forc=1:
numrows,
rij_temp(c)=min([equi_tem(i,c)equi_tem(c,j)]);
end
simiRk(i,j)=max(rij_temp);
end
end
%--------------%
ifsum(sum(simiRk-equi_tem,1))~=0,
numselfmul=numselfmul+1;
equi_tem=simiRk;
else
sign=1;
break
end
%--------------%
end
ifsign==1,
disp('从相似矩阵到等价矩阵改造成功!
!
!
');
else
disp('从相似矩阵到等价矩阵改造失败!
!
!
');
end
equiR=simiRk;
numclass=input('请输入聚类数:
');
%---------在不同的截集水平进行聚类--------------%
clasc=0;
comp_vec(1,1:
numrows)=0;
index=0;
clasc=0;
tip=0;
alpha=0;
temnumeachclass=0;
while(tip==0),
%alpha=input('请输入进行分类的截集水平λ:
');
%alpha=0.5;%调试
if(alpha<0||alpha>1),
error('您输入的截集水平λ不符合分类要求->执行结束!
!
!
');
end
comp_arr=ones(numrows)*alpha;
result_arr=(equiR>=comp_arr);%--------------------result_arr判断矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%捡菜算法
fori=1:
numrows,
ifsum(comp_vec(1,:
)==result_arr(i,:
))temnumeachclass=0;
%numeachclass(clasc)=index-temnumeachclass;
temsave=result_arr(i,:
);
forj=1:
numrows,
ifsum(result_arr(j,:
)==temsave)==numrows,
index=index+1;
class(index)=j;
result_arr(j,:
)=0;%--------------------说明已经被归类
temnumeachclass=temnumeachclass+1;
end
end
clasc=clasc+1;
nec(clasc)=temnumeachclass;
else
continue;
end
end
ifclasc>=numclass,
tip=1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%当模糊分类的数目小于等于所给出的类数时退出循环体
disp('成功!
!
!
');
else
clearclass;
clearnumeachclass;
clearnec;
clasc=0;
index=0;
temnumeachclass=0;
alpha=alpha+0.01;
end
end
%----取聚类结果----%
num=0;
n=0;
fori=1:
clasc,
forj=1:
nec(i),
num=num+1;
n=n+1;
CLUS(n,:
)=INPUTDATA(class(num),:
);
end
n=n+1;
CLUS(n,:
)=inf;
end
%formatsingle(CLUS)
lenexport=size(CLUS,1);
fori=1:
lenexport,
RESULT(i,:
)=sprintf('%15.2f',CLUS(i,:
));
end
RESULT