基于隶属度函数模糊CMAC神经网络算法matlab仿真

123 阅读3分钟

1.算法描述

       CMAC神经网络具有小脑的机能,因而,被广泛应用于机器人的运动控制。或者反过来说,正是为了机器人的运动控制,Albus构造了CMAC神经系统,以模拟脊椎动物的小脑机能。 正如Albus所说的:“然而,对我来说,CMAC最重要的特征是,它提供了一种认识和理解脑计算的途径,导致了一系列关于智能系统积木的重要见解。”为此,Albus又称CMAC神经网络为小脑算术计算模型(Cerebellar Model ArithmeTIc Computer, CMAC)。

 

       泛化能力(generalization ability)是指机器学习算法对新鲜样本的适应能力。 学习的目的是学到隐含在数据背后的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输出。CMAC网络中,若两个输入向量相近,则他们所触发的神经元有重叠,距离越近,重叠越多;若两个输入向量相距较远,则它们触发的神经元没有重叠。因此CMAC网络具有局部泛化能力,它的泛化能力源自于它的网络结构本身。

 

        影响CMAC泛化精度的主要因素有:训练精度、泛化常数和样本点选择。对于一个神经网络来说,泛化能力越强,意味着经过样本点训练后,对于样本集附近的非样本点的输入,网络输出与期望输出间的误差越小。

1)CMAC是局部逼近神经网络,只对输入空间的小部分范围进行训练,只有相应小部分的几个权值调节神经网络的输出,因此对于每次的输入输出数据需要调整的权值很少,学习速度比全局神经网络快,更能符合实时控制的要求。

2)CMAC具有较强的输入和输出的映射能力,并且可以根据不同的精度要求来逼近任意类型函数。

3)CMAC具有局部泛化能力,对具有同一规律的学习集以外的数据,经过训练,网络也能给出合适的输出。

4)CMAC采用查表寻址方式,易于计算机编程实现,网络形式简单,在线计算速度快。

 

2.仿真效果预览

matlab2022a仿真结果如下:

1.png

2.png

3.png

3.MATLAB核心程序 `t=x_train;% 自变量t

y=y1_train;%因变量y

 

min_in=min(t);%输入自变量最小值

max_in=max(t);%输入自变量最大值

n=numel(t);%自变量的位数

 

size_n=360;%量化等级,越大精度越高

 

s=[1:size_n];%S空间,输入量化后的离散空间

 

train_num=180;%用于训练的样本个数

 

maxgen=50;%最大迭代次数

 

mse=zeros(1,maxgen);%均方误差向量

gen=0;%实际迭代次数

eta=1.0;%学习率η

error_goal=0.00001;%误差精度要求

A_star=6;%每个状态对应的关联单元个数

common_unit=5;%相邻关联组有相同关联单元个数

a_num=size_n*A_star-(size_n-1)*common_unit;%关联单元总数

a=ones(1,a_num);% a 向量

w=zeros(1,a_num);% 权值向量

 

% 获取训练样本 的输入和输出

train_in=zeros(1,train_num);%训练样本输入

train_out=zeros(1,train_num);%训练样本输出

 

for i=1:train_num

    train_in(i)=t(floor((i-1)*n/train_num+1));

    train_out(i)=y(floor((i-1)*n/train_num+1));

end

 

% 开始训练样本

for i=1:maxgen

    gen=i;

    for j=1:train_num

        s_seq=floor((train_in(j)-min_in)/(max_in-min_in)*(size_n-1))+1;%量化空间S的序号

        w_seq=(s_seq-1)*(A_star-common_unit)+1;%权值序号

        ye(j)=sum(w(w_seq:w_seq+A_star-1));%实际输出        

        for k=w_seq:w_seq+A_star-1 %修正权值

            w(k)=w(k)+eta*(train_out(j)-ye(j))/A_star;

        end        

    end

    error=0;

    for j=1:train_num

        error=error+(train_out(j)-ye(j))^2;

    end

    mse(i)=error;

if error<error_goal %误差达到目标值,退出训练

        break;

    end    

end

%检验训练好的网络

t2=x_test;% 自变量t

y2=y1_test;%因变量y

n=numel(t2);%自变量的位数

min_in=min(t2);%输入自变量最小值

max_in=max(t2);%输入自变量最大值

n=numel(t2);%自变量的位数

size_n=360;%量化等级,越大精度越高

for i=1:n

    s_seq=floor((t2(i)-min_in)/(max_in-min_in)*(size_n-1))+1;%S序号

    w_seq=(s_seq-1)*(A_star-common_unit)+1;%权值序号

    yp(i)=sum(w(w_seq:w_seq+A_star-1));

end`