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

资源简介

利用蚁群算法得到模糊聚类的初始值,再利用FCM对样本数据进行分类。

资源截图

代码片段和文件信息

clc;
clf;
clear;
 % X = 测试样本矩阵;

X = load(‘data1.TXT‘);
[Nn]=size(X);      % N =测试样本数;n =测试样本的属性数;
K = 4;              % K = 组数; 
R = 100;            % R = 蚂蚁数; 
t_max = 1000;       % t_max =最大迭代次数;           
% 初始化
c = 10^-2;
tau = ones(NK) * c;    %信息素矩阵,初始值为0.01的N*K矩阵(样本数*聚类数)
q = 0.9;                % 阈值q
rho = 0.1;              % 蒸发率
best_solution_function_value = inf; % 最佳路径度量值(初值为无穷大,该值越小聚类效果越好)
tic                     %计算程序运行时间
t = 1; 
%=======程序终止条件(下列两个终止条件任选其一)======
% while ((t<=t_max))                             %达到最大迭代次数而终止
% while ((best_solution_function_value>=19727))  %达到一定的聚类效果而终止
while ((best_solution_function_value>=19727))    
%========================= 
    %路径标识字符:标识每只蚂蚁的路径
    solution_string = zeros(RN+1);     
    for i = 1 : R                       %以信息素为依据确定蚂蚁的路径
        r = rand(1N);    %随机产生值为0-1随机数的1*51的数组
        for g = 1 : N
            if r(g) < q     %如果r(g)小于阈值
                tau_max = max(tau(g:));
                Cluster_number = find(tau(g:)==tau_max);   %聚类标识数,选择信息素最多的路径
                solution_string(ig) = Cluster_number(1);   %确定第i只蚂蚁对第g个样本的路径标识
            else            %如果r(g)大于阈值求出各路径信息素占在总信息素的比例,按概率选择路径
                sum_p = sum(tau(g:)); 
                p = tau(g:) / sum_p; 
                for u = 2 : K 
                    p(u) = p(u) + p(u-1); 
                end
               rr = rand;          
                for s = 1 : K 
                    if (rr <= p(s)) 
                       Cluster_number = s;
                       solution_string(ig) = Cluster_number;  
                    break; 
                end 
            end
        end
    end

    % 计算聚类中心
    weight = zeros(NK);
       for h = 1:N              %给路径做计算标识
           Cluster_index = solution_string(ih); %类的索引编号          
           weight(hCluster_index) = 1;          %对样本选择的类在weight数组的相应位置标1
       end

       cluster_center = zeros(Kn);  %聚类中心(聚类数K个中心)
       for j = 1:K
           for v = 1:n
               sum_wx = sum(weight(:j).*X(:v));   %各类样本各属性值之和
               sum_w = sum(weight(:j));            %各类样本个数
               if sum_w==0                          %该类样本数为0,则该类的聚类中心为0
                 cluster_center(jv) =0
                  continue;
               else                                 %该类样本数不为0,则聚类中心的值取样本属性值的平均值
               cluster_center(jv) = sum_wx/sum_w;
               end
            end
       end

    % 计算各样本点各属性到其对应的聚类中心的均方差之和,该值存入solution_string的最后一位
      F = 0;
      for j= 1:K
          for ii = 1:N
              Temp=0;
              if solution_string(iii)==j;                
                  for v = 1:n
                      Temp = ((abs(X(iiv)-cluster_center(jv))).^2)+Temp;
                  end
                  Temp = sqrt(Temp);
              end
            F = (Temp)+F;
          end        
      end

       solution_string(iend) = F;                      

   

评论

共有 条评论

相关资源