matlab2019a
CMAC最大特点是局部逼近,因此它具有特殊的结构。
如上图,假设输入是二维,即X=(x1,x2)X=(x1,x2),x1,x2∈[0,5]x1,x2∈[0,5](即使不是也可以先标准化,[0,5][0,5]不是固定的,可以是其他,本文只是为了好理解而使用这个范围)。
1)每一维的输入xixi都具有层mm和块nbnb的概念(注意,这个层的意思和一般神经网络层的意思不一样)。在图中Tier是层的意思,也就是每一维具有m=4m=4层,每层有nb=2nb=2块,例如第一层Tier1具有两个块A、B。根据mm和nbnb确定每一维等分切片的个数,即m⋅(nb−1)+1m⋅(nb−1)+1,例如上图中,每维被切分为4*(2-1)+1=5等份。
2)输入的维度之间,相同的层所激活的块联合起来对应一个权值地址空间。如上图,当前X=(3.5,3.3)X=(3.5,3.3),x1x1在不同层激活的块是B、D、F、G,x2x2是b、d、f、g,此时所对应的权值索引是Bb、Dd、Ff、Gg,把这4个权值加起来就是输出。由此可以看出,有多少层就激活多少个权值。同时,不存在同维度块联合、不同维度不同层块联合的情况,也就是说不存在AB、AC、Ad等情况。由此算来,可能使用到的权值个数为m⋅nbnm⋅nbn,nn为输入的维度。
3)一般CMAC网络的整体构架如下图,第一层是输入层;第二层是虚拟联想空间,即对应上图的Aa、Ab、Ba、Bb……;第三层是物理存储空间,即根据第二层给出的索引找到对应的权值;第四层即输出层。
4)如果输入维度很大,根据m⋅nbnm⋅nbn,权值个数指数增长,然而也许只有少部分的权值被使用(有些权值从来没被激活),所以可以使用哈希表方法存储权值,减小无用空间的开支。
5)权值更新公式为
wt+1=wt+α/m⋅ewt+1=wt+α/m⋅e
αα为学习率,mm是层的个数,ee为样本真值与网络预测的误差,只有激活的权值被更新。其实可以把mm拿掉,看成使用一般神经网络的梯度下降法。
function [Weight,Error,Ypre2] = func_CMAC_train(x,y,Iters,Learn_rate,Goals);[R,C] = size(x);
%最小值Vmin = 0*ones(1,C);%最大值Vmax = 1*ones(1,C);%位数Xwidth = numel(x(:,1));
%量化Qlen = 200;%S空间S_space = [1:Qlen];%用于训练的样本个数kk = 1;Len_train = kk*R;
%误差Error = [];%状态关联单元个数Nuints1 = 7;%相同关联单元个数Nuints2 = 4;
%总关联单元数Nuints_all= Qlen*Nuints1-(Qlen-1)*Nuints2;%权值Weight = zeros(C,Nuints_all);
%获取训练样本P_train=zeros(Len_train,C);T_train=zeros(Len_train,1);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 i for j=1:Len_train %量化S空间 for jj = 1:C
S_idx = floor((P_train(j,jj)-Vmin(jj))/(Vmax(jj)-Vmin(jj))*(Qlen-1)) + 1;
W_idx(jj) = (S_idx-1)*(Nuints1-Nuints2)+1; %输出
T_predict(jj,j) = sum(Weight(jj,W_idx(jj):W_idx(jj)+Nuints1-1)); end
for jj = 1:C %CMAC权值更新 for k=W_idx(jj):W_idx(jj)+Nuints1-1
Weight(jj,k) = Weight(jj,k) + P_train(j,jj)/sum(P_train(j,:))*Learn_rate * (T_train(j)-sum(T_predict(:,j)));
end end end error = 0; for j=1:Len_train
error = error + abs(T_train(j)-sum(T_predict(:,j)));
Ypre(j) = sum(T_predict(:,j)); end Error(i)=error; endYpre2=Ypre(1:kk:end);1.2.3.4.5.6.7.8.9.10.11.
12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.
47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.
function Y_cmac2 = func_CMAC_test(x,Weight);[R,C] = size(x);%位数Xwidth = numel(x(:,1));
Vmin = 0*ones(1,C);Vmax = 1*ones(1,C);%量化等级Qlen = 200;Nuints1= 7;
Nuints2= 4;for i=1:Xwidth for jj = 1:C
S_space = floor((x(i,jj)-Vmin(jj))/(Vmax(jj)-Vmin(jj))*(Qlen-1))+1;
W_space =(S_space-1)*(Nuints1-Nuints2)+1;
Y_cmac(jj,i) = sum(Weight(jj,W_space:W_space+Nuints1-1));
end Y_cmac2(i) = sum(Y_cmac(:,i));end1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删