在科学实验及应用领域中,时常需要在分析一组测试数据的基础上去求自变量与应变量之间近似函数关系表达式,以便计算机或其他设计人员利用它来方便地进行其他设计计算。这类问题在图形上就是由测得的点求曲线拟合的问题。所谓拟合,是指设法找出某函数,它能最佳地拟合数据。
在曲线拟合时,并不要求拟合曲线一定要经过每一个数据点,其思想是使它能够反映这些离散数据的变化趋势,使数据点的误差平方和最小。也就是已知一组测定的数据(例如,N个点(x i ,yi),i=1,…,N,x i ,yi可为标量或者向量)去求得自变量x和因变量y的一个近似解析表达式y=f(x)。若记误差E i =f(x i )-yi, i=1, 2,…,N,则要使误差的平方和最小,即要求
为最小,这就是常用的最小二乘法原理。
常规的MATLAB拟合函数包含多项式拟合函数polyfit、非线性函数拟合函数lsqcurvefit与神经网络拟合函数。多项式拟合函数polyfit的调用格式为p=polyfit(x, y, n),举例如下。
可得到拟合的结果如图1-4所示。
图1-4 多项式拟合的输出结果
多项式拟合具有拟合速度快和表达形式简单直观的特点,但对于多维函数拟合则受到很大的限制。MATLAB的非线性函数拟合函数lsqcurvefit,其调用格式为x = lsqcurvefit(fun,x0,xdata,ydata),理论上可以对任意函数进行最小二乘拟合,当然也包括神经网络函数,但该函数属于通用算法,无论收敛速度还是精度都不如专用算法,而且对于复杂映射拟合的程序可扩展性与移植性都比较差。本文将比较它与神经网络的拟合效果。
BP神经网络则利用图1-2中的函数结构对非线性函数进行拟合,以函数
为例来说明BP神经网络拟合非线性函数的方法。
Step 1: 得到神经网络输入/输出的样本,本书利用式(1-1)随机生成了100组样本,代码如下。
Step 2: 创建一个BP神经网络。
Step 3: 设置训练参数,对BP神经网络进行训练。
Step 4: 测试BP神经网络的拟合性能。
经过以上步骤,可得到神经网络的训练情况如图1-5所示,输出情况如图1-6所示。
图1-5 神经网络训练情况
本文对式(1-1)进行了简单的变形,假定了一个待拟合函数,并利用lsqcurvefit函数对数据进行拟合。
图1-6 神经网络训练前后与期望输出的比较
函数分为两部分,第一部分为子函数,它假定待拟合函数为:
其中,c=[c 1 ,…,c 8 ] T 。
第一部分子函数的详细代码如下。
第二部分为调用该函数,其详细代码如下。
输出结果如图1-7所示。
图1-7 神经网络拟合与非线性lsqcurvefit拟合效果的比较
从图1-7中可以看出,BP神经网络对函数的拟合效果比lsqcurvefit好,虽然两者在实际情况中的应用各有特点,但由于使用lsqcurvefit函数必须提前知道拟合函数的表达式,因此一般情况下,BP神经网络对非线性函数具有更好的适应能力。