CMAC小脑CMAC逼近sin(t)函数的训练和测试

Posted fpga&matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMAC小脑CMAC逼近sin(t)函数的训练和测试相关的知识,希望对你有一定的参考价值。

% CMAC逼近sin(t)函数
 
clear all;
close all;
clc;
t=[0:2*pi/360:2*pi];% 自变量t
y=sin(t);%因变量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
%
%对权值向量进行插值处理
for i=1:a_num
    if w(i)==0
        %找到第一个不为零的
        j=i;
        while(w(j)==0 && j<a_num)
            j=j+1;
        end
        if j<a_num
            for k=i:j-1
                w(k)=w(j)-(k-i)*(w(j+1)-w(j));
            end
        end
    end
end
%
%检验训练好的网络
for i=1:n
    s_seq=floor((t(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

% 绘图
figure(1);
plot(t,y,'b',t,yp,'r--','linewidth',2);%原曲线和网络输出曲线
title('实际输出和网络输出对比');xlabel('t');ylabel('y-t,yp-t');
figure(2);
plot(train_in,train_out,'linewidth',2);
title('训练样本曲线');xlabel('train_in');ylabel('train_out');
figure(3);
plot([1:gen],mse(1:gen),'linewidth',2);
title('均方误差误差曲线');xlabel('Generation');ylabel('Mean Square Error');

 

 

以上是关于CMAC小脑CMAC逼近sin(t)函数的训练和测试的主要内容,如果未能解决你的问题,请参考以下文章

CMAC小脑网络基于CMAC的目标分类matlab仿真

如何使用 OpenSSL 的 CMAC_xxx 函数计算 AES CMAC?

HMAC与CMAC

DAA和CMAC

使用RBF神经网络实现函数逼近

用切比雪夫最佳一致逼近设计线性相位FIR带通滤波器