1.软件版本
MATLAB2021a
2.本算法理论知识
程序流程如下所示:
CMAC的基本原理为:对于每个输入,
中只有个单元为1,而其余的均为0,因此是一个稀疏矩阵。哈希编码是压缩稀疏矩阵的常用技术,具体方法是通过一个产生随机数的程序来实现的。以的地址作为随机数产生的程序的变量,产生的随机数作为的地址。由于产生的随机数限制在一个较小的整数范围内,因此远比小得多。显然,从到的压缩是一种多对少的随机映射。在中,对每一个样本有个随机地址与之对应,个地址存放的权值通过学习得到,其累加和即作为CMAC的输出。其表达式为:
其中,
为第j个存储单元的权值,若激活,则其值为1,否则为0,只有个存储单元对输出有影响。相近的输入激活的存储单元有交叠,产生相近的输出,不相近的输入将产生不相近的输出。对应的误差表达式为:
CMAC算法中结果输出阶段从CMAC存储单元产生一实际输出,学习过程根据期望输出与实际输出的误差大小来更新CMAC存储单元中的权值。在常规CMAC算法中误差被平均分配到所有被激活的存储单元。设
为某一状态,是经过第次迭代后存储在第个存储单元中的权值。常规CMAC更新算法为:
为状态s的期望输出,
为状态s的实际输出,
为学习常数。
3.核心代码
登录后复制
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 end1.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.
4.操作步骤与仿真结论
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删