首页 > 其他 > 详细

基于Matlab的BP神经网络分段插值仿真

时间:2014-03-18 13:14:39      阅读:466      评论:0      收藏:0      [点我收藏+]

CORDIC也许是最值得研究的硬件实现技术了,但是却又很难被实现:它的优势就是同样的硬件可以被实现为多种函数,但是性能却非常不好。High-order polynomial approximation可以给予很低的误差实现,但是这普遍不适合硬件实现。一种很有成效的方法是table-driven方法,但是如果表很大将会带来很大的开销。

给出一种现在使用最广泛的方法,很明显对于FPGA来说这是一种当前最好的实现方式即low-order polynomials(主要是线性的)和小的查找表的结合。对于这种技术主要的挑战是如何选择内插点以及如何确保查找表较小。Low-order interpolation主要有三大优势。第一,同一硬件结构可以被用于多种函数实现,由于仅需要修改low-order polynomials系数。第二,它很适合FPGA当前结构,由于内建的mulipliers、adders和memory核

对于大多数函数,通过均匀分隔来进行插值不够理想的。在sigmoid函数这个例子中,显然更多的间隔应该被使用。然而硬件实现需要更快的将参数映射到合适的间隔上。本着这种选择和线性插值法,最关键的就在于函数值和每个间隔如何联系起来。最普遍的方法就是武断的选择间隔的重点,也就是如果x∈[L,U],f(x)=f(L/2 + U/2),或者去选择一个值来减小这种绝对误差。这并不是一种好的方法。对于一个定点间隔,最好的函数值一般并不是中点所对应的。这取决于函数的“curvature(曲率)”,相对误差可能比绝对误差更重要。例如对于sigmoid函数,f(x) =1/(1+e^-x),函数是关于原点对称的,但是相对误差只在一面变得更加明显,两边的误差取决于间隔,因此绝对误差并不总是一个常量或者是线性的。

         普遍的方法是:假设I = [L,U]做为一个间隔,L<U 且f : I ->R被逼近,假设f’ :I->R是一个线性函数,f’(x) = c1+c2x,对于常量c1和c2,对于f,我们的目标是观察相对误差函数。


下面是利用Matlab对分段插值来逼近sigmoid函数的代码:

%% 插值误差计算
t = 0.5:1/16:1; %9个
for i = 1:8
    i
    sigL(i) = 1/(1 + exp(-t(i)));
    sigU(i) = 1/(1 + exp(-t(i+1)));
    %sigL(i)
    %sigU(i)
    c2(i) = (sigU(i)-sigL(i))/(t(i+1)-t(i));
    c1(i) = sigU(i)-c2(i)*t(i+1);
end
f2 = (c1(1)+c2(1)*x).*(x>=t(1)&x<t(2))+(c1(2)+c2(2)*x).*(x>=t(2)&x<t(3))+(c1(3)+c2(3)*x).*(x>=t(3)&x<t(4))+...
    (c1(4)+c2(4)*x).*(x>=t(4)&x<t(5))+(c1(5)+c2(5)*x).*(x>=t(5)&x<t(6))+(c1(6)+c2(6)*x).*(x>=t(6)&x<t(7))+...
    (c1(7)+c2(7)*x).*(x>=t(7)&x<t(8))+(c1(8)+c2(8)*x).*(x>=t(8)&x<=t(9));
f1 = 1./(1+exp(-x)).*(x>=0.5 & x <=1);
%x = linspace(0.5,1);

figure(1)
plot(x,f2,‘g‘); %分段函数绘图
wucha = (f1-f2)./f1*2000;
hold on;
plot(x,wucha,‘r‘);
axis([0.5,1,-0.2,0.8]);

下面是仿真图

bubuko.com,布布扣

基于Matlab的BP神经网络分段插值仿真,布布扣,bubuko.com

基于Matlab的BP神经网络分段插值仿真

原文:http://blog.csdn.net/xz_rabbit/article/details/21445343

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!