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

📄 efcm.m

📁 在ECM的基础上加入了模糊关系
💻 M
字号:
%%%%注意,对于聚类不许调整Dthr出现聚类数结果为1的情况,
%当出现聚类数为1时其目标函数值是假的,不是真正的样本聚类结果所具有的目标函数值
%注意:用prestd进行归一化一定要将数据按行数小于列数的方式排列才是正确的
%也就是说,行代表的是变量个数,列代表样本数那才是正确的

clc
clear
load data1
data=data1;
[m n]=size(data);
data(:,4:6)=[];
iitr=[1:4:m 2:4:m 3:4:m];
iitst=[4:4:m];
dddd=[];
dddd=data(iitr,:);
data=[];
data=dddd;
[m n]=size(data);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%以上部分是为了得到样本类标签而改动过得
% data(:,4)=[];
% [data,meanp,stdp] = prestd(data');
% data=data';
data=guiyihua(data);
symbol=1;%初始化标志位
mm=3;%隶属度上面的次数

Cc=[];%聚类中心
Ru=[];%聚类中心的半径
result=[];%记录每个样本归属哪个类
%利用第一个样本初始化第一个聚类中心点
Cc(1,:)=data(1,:);%n维数据
Ru(1)=0;%一维数据
result(1)=1;%第一个数据属于第一个类
u=zeros(m,10);%初始化隶属度矩阵,最大化为聚类个数为样本个数
cluster=[];%初始化类别矩阵,用来存放各类的数据
Dthr=0.5;
% Dthr=0.045; %对应310数据,误差0.0401
% Dthr=0.5;  %对应703数据,误差0.0074
% Dthr=0.5;    %对应花的数据,误差0.0246
% Dthr=0.24;    %对应酒的数据,误差0.0743
u(1,1)=1;%初始化第一个数据的隶属度
for i=2:m%总的样本循环
d=[];
[t,tl]=size(Cc);
%%%%%%%%%%%%%%%%%%%%%%%%%%Step1
for s1=1:t
    su=0;
    su=(data(i,:)-Cc(s1,:))*(data(i,:)-Cc(s1,:))';
    d(s1)=sqrt(su);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%计算uij
% if symbol~=2        
      for s1=1:t
         if data(i,:)==Cc(s1,:);
            u(i,:)=0;
            u(i,s1)=1;
         end
      end
      if  1==isempty(find(1==u(i,:)))
         sss=(d(:).^(-4/(mm-1)))'*ones(t,1);%由于d已经取了根号,所以这里的-2/(m-1),改为-4/(m-1)
           for s1=1:t
             u(i,s1)=(d(s1)^(-4/(mm-1)))/sss;
           end
      end
% else
%         for m1=1:i
%             d=[];
%             [t,tl]=size(Cc);
%             for s1=1:t
%               su=0;
%               su=(data(m1,:)-Cc(s1,:))*(data(m1,:)-Cc(s1,:))';
%               d(s1)=sqrt(su);
%             end
%             %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%             for s1=1:t
%               if data(m1,:)==Cc(s1,:);
%                   u(m1,:)=0;
%                   u(m1,s1)=1;
%               end
%             end
%             if  1==isempty(find(1==u(m1,:)))
%                sss=(d(:).^(-4/(mm-1)))'*ones(t,1);%由于d已经取了根号,所以这里的-2/(m-1),改为-4/(m-1)
%                  for s1=1:t
%                    u(m1,s1)=(d(s1)^(-4/(mm-1)))/sss;
%                  end
%             end
%         end
%         symbol=1;
%         u
% end
            
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%step2
[dmin,sub]=min(d);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%step3,4,5
if dmin>=Ru(sub)
%取min(Sij)
    inter=[];
    for s1=1:t
    inter(s1)=d(s1)+Ru(s1);
    end
    [S,nu]=min(inter);
    %增加新的聚类中心点
    if S>2*Dthr
        Cc(t+1,:)=data(i,:); 
        Ru(t+1)=0;
        result(i)=t+1;%新建一个类,这个样本为新类的中心
        %i=i-1;%只要新建立了类就将i值减1,这是为了让它能够更新隶属度矩阵的值
        symbol=2;%意思创建了新类
    else
        Ru(nu)=S/2;
        if Ru(nu)<Dthr
        ls=d(nu)/Ru(nu);
       %修改中心坐标
        for f1=1:n
        Cc(nu,f1)=data(i,f1)-(data(i,f1)-Cc(nu,f1))/ls;
        end
        result(i)=nu;
       % i=i-1;
        symbol=2;%代表类中心和类半径修改了,要对隶属度矩阵进行更新
        else    %如果Ru(nu)>=Dthr,则创建新类
              Cc(t+1,:)=data(i,:);
              Ru(t+1)=0;
              result(i)=t+1;%这个样本为新建类的第一个样本
         %     i=i-1;%只要新建立了类就将i值减1,这是为了让它能够更新隶属度矩阵的值
              symbol=2;%意思创建了新类
        end
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%

   if symbol==2
       u=zeros(m,10);
         for m1=1:i
              d=[];
            [t,tl]=size(Cc);
            for s1=1:t
              su=0;
              su=(data(m1,:)-Cc(s1,:))*(data(m1,:)-Cc(s1,:))';
              d(s1)=sqrt(su);
            end
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%
            for s1=1:t
              if data(m1,:)==Cc(s1,:);
                  u(m1,:)=0;
                  u(m1,s1)=1;
              end
            end
            if  1==isempty(find(1==u(m1,:)))
               sss=(d(:).^(-4/(mm-1)))'*ones(t,1);%由于d已经取了根号,所以这里的-2/(m-1),改为-4/(m-1)
                 for s1=1:t
                   u(m1,s1)=(d(s1)^(-4/(mm-1)))/sss;
                 end
            end
        end
        symbol=1;
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else
    result(i)=sub;
    symbol=1;%没有类中心被修改,也没有增加新的类
end
end
U=u
% result
%计算目标函数值
z=0;
[t,tl]=size(Cc);
for i=1:m
    for j=1:t
        ts=0;
        ts=(data(i,:)-Cc(j,:))*(data(i,:)-Cc(j,:))';
        z=z+u(i,j)*(ts);
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%用于测量类内样本到中心的距离
dis=zeros(t,m);
for i=1:t
    record=[];
    record=find(i==result);
    tp=length(record);
    for j=1:tp
        dis(i,j)=sqrt((data(record(j),:)-Cc(i,:))*(data(record(j),:)-Cc(i,:))');
    end
end
%dis
%%%%%%%%%%%%%%%%%%%%%%%%
dis=dis(:);
p=length(dis);
chaoguo=0;
for i=1:p
    if dis(i)>Dthr
        chaoguo=100000;
    end
end


% Cc
% u
 Ru
 z


S=measure(data,U,Cc)
chaoguo


figure(45)
zhongbiao=Cc;
%%%%%%计算各样本的类别标签:Cc中类中心坐标是按行存储的,
[tt1,tt2]=size(data);
[dd1,dd2]=size(Cc);
leiad=zeros(tt1,1);
for i=1:tt1
    juli=zeros(1,dd1);
    for j=1:dd1
        juli(j)=sum((data(i,:)-Cc(j,:)).^2);
    end
    [xxxxxx,leiad(i)]=min(juli);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

for i=1:t
    x=zhongbiao(i,1);
    y=zhongbiao(i,2);
    plot(x,y,'ro');
    hold on;
end


maxres=result;
[p1,p2]=size(data);
wy=zeros(1,p2);%纯粹为了是画图语句方便写
data(p1+1,:)=wy;
x=[];
y=[];
for i=1:t
    ind=[];
    indt=repmat(p1+1,1,p1+1);
    ind=find(maxres==i); 
    z=length(ind);
    indt(1:z)=ind;
    x(:,i)=data(indt,1);
    y(:,i)=data(indt,2);
end
x=x';
y=y';
hold on
plot(x(1,:),y(1,:),'g+');
plot(x(2,:),y(2,:),'bd');
plot(x(3,:),y(3,:),'ks');
plot(x(4,:),y(4,:),'mo');
plot(x(5,:),y(5,:),'bp');
plot(x(6,:),y(6,:),'gd');
plot(x(7,:),y(7,:),'m+');
plot(x(8,:),y(8,:),'b+');
plot(x(9,:),y(9,:),'kp');
plot(x(10,:),y(10,:),'mh');


⌨️ 快捷键说明

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