目录
一、理论基础
J.S.Albus于20世纪70年代提出了CMAC,即小脑模型关节控制器,它由含局部调整,相互覆盖接受域的神经元组成。它是模拟人的小脑的一种学习结构,是基于表格查询式输入输出的局部神经网络模型,提供了一种从输入到输出的多维非线性映射能力。小脑模型关节控制器(CMAC)是由含局部调整,相互覆盖接受域的神经元组成,J.S.Albus于20世纪70年代提出了CMAC,它是模拟人的小脑的一种学习结构,是基于表格查询式输入输出的局部神经网络模型,提供了一种从输入到输出的多维非线性映射能力。由于CMAC具有学习速度快、泛化能力强、易于实现、不存在局部极小点等特点,被广泛地应用于对实现性要求较高的控制系统中,作为辩识器和控制器,并取得了较好的效果。
CMAC的基本原理为:对于每个输入,中只有个单元为1,而其余的均为0,因此是一个稀疏矩阵。哈希编码是压缩稀疏矩阵的常用技术,具体方法是通过一个产生随机数的程序来实现的。以的地址作为随机数产生的程序的变量,产生的随机数作为的地址。由于产生的随机数限制在一个较小的整数范围内,因此远比小得多。显然,从到的压缩是一种多对少的随机映射。在中,对每一个样本有个随机地址与之对应,个地址存放的权值通过学习得到,其累加和即作为CMAC的输出。其表达式为:
CMAC算法中结果输出阶段从CMAC存储单元产生一实际输出,学习过程根据期望输出与实际输出的误差大小来更新CMAC存储单元中的权值。在常规CMAC算法中误差被平均分配到所有被激活的存储单元。设为某一状态,是经过第次迭代后存储在第个存储单元中的权值。常规CMAC更新算法为:
从某种意义上来说,CMAC与模糊逻辑不但是相互补充的,而且也是相通的、可以结合的。首先,利用连接主义表达的模糊逻辑控制器必然要引入学习机制,也带来了两者结合的诸多优点,如存储容量的减小,泛化能力的提高以及连接主义结构的容错性等。其次,CMAC的分布表达式中,一个值由散布于许多计算单元的活性模式表示,每个计算单元有涉及许多不同值的表达,因此每个计算单元都有一个感受野,即它所表达的所有值的集合,这相当于每个计算单元都对应一个模糊集合,或者说感受野相当于隶属函数。这正是它们能够相结合的一个基础。因此,基于模糊的CMAC也不断地被广大学者所关注,有着很好的应用前景。
神经网络可分为全局逼近神经网络和局部逼近神经网络,如果网络的一个和多个连接权系数或自适应可调参数,在输入空间的每一点对任何一个输出都有影响,则称该神经网络为全局逼近网络。如BP网络,每一次样本学习都需要重新调整网络的所有权值,收敛速度慢,易陷入局部最小,很难满足控制系统的实时性要求;若对输入空间的某个局部区域,只有少数几个连接权影响网络的输出,则称该网络为局部逼近网络,从而使局部逼近网络具有学习速度快的优点。CMAC、RBF以及某些模糊神经网络是局部逼近网络。
CMAC比其他神经网络的优越性体现在:
(1)CMAC神经网络把信息存储在局部的结构上,在保证函数逼近的前提下,学习速度快。
(2)CMAC函数逼近器对学习数据出现的次序不敏感,因此,CMAC在时变、非线性系统控制中得到广泛应用。
(3)CMAC结构简单,易于硬件实现和软件实现。
因此,CMAC已被越来越多的学者所关注,并得到广泛的应用。
二、核心程序
function [Weight,Error] = func_CMAC_train(x,y,Iters,Learn_rate,Goals);
%最小值
Vmin = min(x);
%最大值
Vmax = max(x);
%位数
Xwidth = numel(x);
%量化
Qlen = 360;
%S空间
S_space = [1:Qlen];
%用于训练的样本个数
Len_train = 180;
%误差
Error = [];
%状态关联单元个数
Nuints1 = 6;
%相同关联单元个数
Nuints2 = 5;
%总关联单元数
Nuints_all= Qlen*Nuints1-(Qlen-1)*Nuints2;
%权值
Weight = zeros(1,Nuints_all);
%获取训练样本
P_train=zeros(1,Len_train);
T_train=zeros(1,Len_train);
for i=1:Len_train
P_train(i) = x(floor((i-1)*Xwidth/Len_train+1));
T_train(i) = y(floor((i-1)*Xwidth/Len_train+1));
end
%训练
for i=1:Iters
for j=1:Len_train
%量化S空间
S_idx = floor((P_train(j)-Vmin)/(Vmax-Vmin)*(Qlen-1)) + 1;
W_idx = (S_idx-1)*(Nuints1-Nuints2)+1;
%输出
T_predict(j) = sum(Weight(W_idx:W_idx+Nuints1-1));
%CMAC权值更新
for k=W_idx:W_idx+Nuints1-1
Weight(k) = Weight(k) + Learn_rate * (T_train(j)-T_predict(j)) / Nuints1;
end
end
error = 0;
for j=1:Len_train
error = error + (T_train(j)-T_predict(j))^2;
end
Error(i)=error;
%退出训练
if error<Goals
break;
end
end
function Y_cmac = func_CMAC_test(x,Weight);
%位数
Xwidth = numel(x);
Vmin = min(x);
Vmax = max(x);
%量化等级
Qlen = 360;
Nuints1= 6;
Nuints2= 5;
for i=1:Xwidth
S_space = floor((x(i)-Vmin)/(Vmax-Vmin)*(Qlen-1))+1;
W_space =(S_space-1)*(Nuints1-Nuints2)+1;
Y_cmac(i) = sum(Weight(W_space:W_space+Nuints1-1));
end
A05-73