m基于K-means聚类算法和神经网络的模糊控制器设计matlab仿真

简介: m基于K-means聚类算法和神经网络的模糊控制器设计matlab仿真

1.算法描述

   聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。​主要的聚类算法可以划分为如下几类:划分方法、层次方法、基于密度的方法、基于网格的方法以及基于模型的方法。下面主要对k-means聚类算法、凝聚型层次聚类算法、神经网络聚类算法之SOM,以及模糊聚类的FCM算法通过通用测试数据集进行聚类效果的比较和分析。

   k-means是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地 选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。 这个过程不断重复,直到准则函数收敛。

算法流程:​

输入:包含n个对象的数据和簇的数目k;​

输出:n个对象到k个簇,使平方误差准则最小。​

步骤:  

(1) 任意选择k个对象作为初始的簇中心; 

(2) 根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇; 

(3) 更新簇的平均值,即计算每个簇中对象的平均值;  

(4) 重复步骤(2)、(3)直到簇中心不再变化;

层次聚类算法
根据层次分解的顺序是自底向上的还是自上向下的,层次聚类算法分为凝聚的层次聚类算法和分裂的层次聚类算法。 凝聚型层次聚类的策略是先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被满足。绝大多数层次聚类属于凝聚型层次聚类,它们只是在簇间相似度的定义上有所不同。

算法流程:

注:以采用最小距离的凝聚层次聚类算法为例:

(1) 将每个对象看作一类,计算两两之间的最小距离;

(2) 将距离最小的两个类合并成一个新类;

(3) 重新计算新类与所有类之间的距离; 

(4) 重复(2)、(3),直到所有类最后合并成一类。

  神经网络的训练主要包括两个部分:正向传播和反向传播两个过程。正向传播得到损失值,反向传播得到梯度。最后通过梯度值完成权值更新(其中梯度就是一个偏导数向量)。采用反向传播算法构建神经网络的模型,可以实现扑克牌数据集的多分类问题。搭建神经网络的主要步骤:

训练的数据
定义节点准备接收数据
定义神经层:隐藏层和预测层
定义 loss 表达式
选择 optimizer 使 loss 达到最小
保存训练结果 对扑克牌数据集进行简单的预处理,读取预处理后的数据加载到神经网络中,搭建有 4 个隐藏层的神经网络。神经网络与感知器的最大的一个区别在于:感知器的激活函数是节阶跃的而神经网络的激活函数是非线性的,从而给神经网络引入了非线性的因素。在对扑克牌的数据集进行训练是使用 ReLU 为每个隐藏层的激活函数,式 (1) 是 ReLU 的函数表达式,如图 1.1 是 ReLU 的函数图像。

   在模糊神经网络设计中,模糊规则的建立是系统设计的瓶颈问题,所以有关神经网络与模糊系统相结合的研究大多集中在模糊神经网络的建模,模糊神经网络结构和算法的研究是国内外学者研究的热点,新模糊神经网络模型和学习算法不断涌现。
   模糊神经网络一般结构如图1所示。第一层为输入层,缓存输入信号。第二层为模糊化层,对输入信号进行模糊化。第三层为模糊规则层。第四层为模糊决策层,主要针对满足一定条件的量进行分类并将模糊量去模糊化。第五层为输出层,输出运算结果。

1.png

2.仿真效果预览
matlab2022a仿真结果如下:

2.png
3.png
4.png
5.png
6.png
7.png
8.png

3.MATLAB核心程序

      15.063   -8.05   0;
       6.943    0     -1];
 
A  = A/max(max(abs(A)));   
   
C2 = [0 0;
      0 1;
      1 0];
  
Ku  = 0.7;
Ke  = 1;
Kec = 1;
K   = 1;
 
%闭环控制器
for k=1:SIM_times
    k
    time(k) = k*ts;
    %定义输入信号
    din(k)   = 2;  
    %定义输出信号
 
    %定义干扰
    q = 0.012 + (0.142 - 0.012) * rand(1,1);
    %定义输出
    Tmp = A * [x,s,o]' + C2 * [(1+Ku)*u1,q]';
 
    o   = Tmp(3);
    
    yout(k)   = o;
 
    e(k)      = yout(k) - din(k);
 
 
    x1   =(1-exp(-10*Ke*e1))/(1+exp(-10*Ke*e1));
    x2   =(1-exp(-Kec*ec))/(1+exp(-Kec*ec));
    
    %第1层输出
    for i=1:7
        o11(i) = x1;
        o12(i) = x2;
    end
    o1=[o11;o12];
    
    %第2层输出
    for i=1:2
        for j=1:7
            z1(i,j)  =-((o1(i,j)-a(i,j))^2)/(b(i,j));
            o2(i,j)  =  exp(z1(i,j));
        end
    end
    
    %第3层输出
    for j=1:7
        for l=1:7
            o3((j-1)*7+l)=o2(1,j)*o2(2,l);
        end
    end
    
    %第4层输出
    I=0;
    for i=1:49
        I = I + o3(i)*Weight(i);
    end
 
    o4   = I/(sum(o3));
    u(k) = o4;
    u1   =-u(k);
 
    e1        = e(k);
    ec        = e(k)-error1;
    error1    = e(k);    
 
    %梯度下降法调整权值
    for i=1:49
        dwp       =  e1*du*o3(i)/(sum(o3));
        %迭代
        Weight(i) =  Weight(i) + eta*dwp;
    end
 
    %中心值更新
    da11=zeros(1,7);
    for j=1:7
        for l=1:7
            da11(j) =  da11(j)+(o2(2,l)*((Weight((j-1)*7+l)*sum(o3))-I));
        end
        da12(1,j)   = -e1*du*(2*(o1(1,j)-a(1,j))*(o2(1,j)))/((b(1,j)^2)*(sum(o3))^2);
        da1(j)      = (da12(1,j))*(da11(j));
    end
    da21 = zeros(1,7);
    for j=1:7
        for l=1:7
            da21(j) = da21(j)+(o2(1,l)*((Weight((l-1)*7+j)*sum(o3))-I));
        end
        da22(2,j) = -e1*du*(2*(o1(2,j)-a(2,j))*(o2(2,j))/((b(2,j)^2)*(sum(o3))^2));
        da2(j)    = (da22(2,j))*(da21(j));
    end      
    da=[da1;da2];
    for i=1:2
        for j=1:7
            a(i,j)=a(i,j)-eta*da(i,j);
        end
    end             
    a_s(:,:,k) = a;
    
    if k == 1
       a_(:,:,k) = a_s(:,:,1);
    else
       for i = 1:2
           for j = 1:7
               dist_tmp(i,j) = (a_s(i,j,k) - a_(i,j))^2;
           end
       end
       dist = sqrt(sum(sum(dist_tmp))); 
       
       if dist < 0.1
           
          tmps(:,:,1) = a_(:,:,k-1);
          tmps(:,:,2) = a_s(:,:,k);
           
          a_(:,:,k) = mean(tmps(:,:,1:2),3);
       else
          a_(:,:,k) = a_(:,:,k-1);
       end
    end
    
相关文章
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
225 0
|
3月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
214 3
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
158 8
|
2月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
167 8
|
2月前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
2月前
|
机器学习/深度学习 算法
采用蚁群算法对BP神经网络进行优化
使用蚁群算法来优化BP神经网络的权重和偏置,克服传统BP算法容易陷入局部极小值、收敛速度慢、对初始权重敏感等问题。
307 5
|
2月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
3月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
221 2
|
2月前
|
机器学习/深度学习 数据采集 存储
概率神经网络的分类预测--基于PNN的变压器故障诊断(Matlab代码实现)
概率神经网络的分类预测--基于PNN的变压器故障诊断(Matlab代码实现)
297 0
|
2月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
146 0

热门文章

最新文章