数据拟合愚见

以下为个人愚见,希望对有缘人有帮助,如有不足,欢迎拍砖!

1、数据拟合问题,可简单转换成方程组求解的问题,且也可简单分为线性与非线性问题。

2、对于线性问题,可简单看成一个超定方程的求解,这时采用最小二乘算法求解即可。
比如:需要拟合的方程为$$y=ax_1+bx_2+cx_3+…$$
其中\(y,x_1,x_2,x_3,…\)为采集的数据,需要拟合的变量为\(a,b,c,…\)
如果把上面的例子化成一个方程组可表示如下的超定线性方程组
$$\\y_1=x_{1,1}+bx_{2,1}+cx_{3,1}+…\\y_2=x_{1,2}+bx_{2,2}+cx_{3,2}+…\\y_3=x_{1,3}+bx_{2,3}+cx_{3,3}+…\\…$$
PS:对于一些表面上是非线性问题却可转换成线性拟合的问题,建议先转换成线性拟合得到结果。有些人可能会说,转换后拟合的数据会放大误差,对于这类会放大误差的问题,还是建议先转换成线性拟合,得到一个解,然后将这个解作为初始值带入非线性拟合问题当中进行求解,也不失为一个很好的方法。
例子:需要拟合的方程为$$y=asin(x_1)+bx_{2}^{2}+cx_1x_2$$
其中\(y,x_1,x_2\)为采集的数据,\(a,b,c\)为需要拟合的变量,这时公式可进行简单的变换
$$
\begin{align}
z_1&=sin(x_1)\\
z_2&=x_{2}^{2}\\
z_3&=x_1x_2\\
y&=az_1+bz_2+cz_3 
\end{align}
$$
对上面的公式,可以很快求解出\(a,b,c\)

3、非线性问题的拟合
    可能我们大部分遇到的都是非线性拟合问题,非线性拟合问题又可简单看成一种简单的循环“迭代问题”。这里先简单说一下在求解非线性问题采用算法时注意的地方:(1)智能算法(比如:遗传算法、粒子群算法……)一般都可简单说成是全局优化算法,当然这里所谓的全局优化算法只能说是相对的,毕竟目前还查不到有什么算法能确定出任意的非线性拟合问题的解。(2)剩下的就是一些局部最优算法了(比如:Broyden形式的求解算法、LM算法……),这类算法的特点是在解的附近时能很快收敛到解。也因此,配合好全局与局部算法是一个不错的选择!(3)为了加快找到解的速度,可考虑采用多线程求解方式【如果你的算法允许】。即使你不会多线程,只要你会编程,网上找一下你所熟悉编程语言的多线程操作例子,不出半个小时,你准能搞定!

4、非线性拟合维度降维

可降维的尽量降低拟合变量的维数。比如拟合表达式为$$y=a+bsin(cx)+dcos(cx)$$,需要拟合的变量为\(a,b,c,d\)。乍一看需要拟合的变量为4个,其实如果\(c\)变量已知,上面的表达式就是一个求解线性方程组问题,也就是说,一旦\(c\)确定了,能很快确定出\(a,b,d\)。这时相当于就只对\(c\)变量进行查找最优值即可,也就从4个变量变成了一个变量的拟合。这对求解效率会大大的提高!

5、非线性拟合时可能遇到的问题
(1)拟合公式里含有积分或者微分等项
解:不管是积分或者是微分,它只是一个函数,自己实现即可
比如:需要拟合的公式为
$$y=a\times sin(\frac{b}{x_1})+c\int_{0}^{x_2}cos(ax^2+bx+c)dx$$
其中\(y,x_1,x_2\)为采集的数据,\(a,b,c\)为需要拟合的变量,这时我们可考虑做如下变换
$$f(a,b,c,y)=c\int_{0}^{y}cos(ax^2+bx+c)dx$$
$$y=a\times sin(\frac{b}{x_1}) + f(a,b,c,x_2)$$
当中的\(f(a,b,c,y)\)函数,我们可以自己写一个积分算法进行求解,这个和公式中直接调用正弦函数\(sin(x)\)是一样的,只是程序内部已经帮我们将正弦函数的算法实现。
同样的,如果有微分项,一样可以使用类似的方法进行处理。
PS:即使有一些软件提供积分或者微分等算法,如果那种算法你不熟悉或者怕被做手脚,加之一些算法的局限性,建议自己编程实现这类积分或者微分求解的问题。

(2)拟合的公式为隐函数的拟合
解:对于这个问题,说白了就是转移一种评价方式的问题,这时进行简单的变换即可
比如:需要拟合的方程为
$$y=a\times sin(x)+\frac{b}{cos(y)}+c\sqrt{xy}$$
其中\(x,y\)为采集的数据,\(a,b,c\)为需要拟合的变量,
正常情况下,程序内部的评价方式可能是\(y-{y}'\),其中一个是真实值一个是拟合值,因为这种评价方式比较困难,这时我们可考虑做如下变换
$$f=a\times sin(x)+\frac{b}{cos(y)}+c\sqrt{xy}-y$$
这时的评价方式即变成\(f-0\),这样就完美解决!

6、拟合的评价方式问题(损失函数)
这里的评价方式只针对求解过程中的评价方式,也因此只讨论非线性问题的评价问题。
所谓的评价方式,就是指用什么方式来解答:什么时候拟合结束,怎样的解才算更优?好的评价函数可以有一定降噪作用,这里不细说,仅列举下面的回答!
这个没有统一的答案,仁者见仁智者见智吧!不过,我还是说下我的想法,有些在求解时喜欢采用各种假设检验来检验解的优度,因为我是一个追求程序效率的人,我并不建议在程序中采用这种方式,因为在调用各种假设检验算法时必定会消耗一部分计算时间,因此一个简单高效的评价方法不失为一种好的方式。
常见的,我们会使用如下形式,即
$$S=\sum_{i=1}^{n}(y_i-{y_i}')^2$$

7、拟合初值的选取问题
因为初值对拟合速度甚至结果有一定影响,因此这里就简单说一下确定数学模型后,拟合非线性问题时,初值的选取的问题。
1、如果已知数学模型,有一定物理意义,则建议根据物理意义选取。
2、当无法确定初值时,且你的数学模型有导数(如果求导模型很复杂甚至没有导数,则可进行简单的差分构造),则可以采用如下的办法进行

步骤: 
(1)求出拟合函数的一阶导数【如果有必要可求更高阶导数】 
(2)使用已知数据求出近似点的一阶导数 
(3)代入一阶导数函数以及原函数求得初值近似值 例子: 
已知一组数据\(x,y\)满足如下关系式,求拟合数据\(a,b,c,d\)的初始近似值
$$y=a+b(x-c)^d$$
步骤: 
(1)$${y}'=bd(x-c)^{(d-1)}$$
(2)因为已知\(x,y\)数据,则根据相应算法求得一组\(x,{y}'\)的近似值,这里记\(f={y}'\)
(3)将\(x,{y}'\) 代入(1)式的方程得到如下三个方程进而求解出\(b,c,d\)
$$
\begin{align}
f_1&=bd(x_1-c)^{d-1} \\
f_2&=bd(x_2-c)^{d-1} \\
f_3&=bd(x_3-c)^{d-1} 
\end{align}
$$
(4)取任意一组\(x,y\)然后将\(b,c,d\)一起代入原方程\(y = a + b (x – c) ^d\) 进而可以求得近似值 \(a\) 
(5)至此\( a,b,c,d\)初始近似值确定完毕!

8、常微分方程拟合

之所以在这里单独列一个点,主要是提供一个求解这类问题的一个快速处理方式:
(1)对于微分项,使用对应差分公式代替,然后按正常流程拟合出对应拟合参数。(由于这个时候的微分使用的差分代替,是比较粗糙的求解的,这个拟合值仅能作为初始值参考)
(2)然后采用使用第(1)点得到的拟合参数作为初始值,常微分方程函数主体采用对应常微分方程求解算法(比如龙格库塔法),然后正常进行非线性拟合。
PS:这种求解方式是先简单粗暴找到一个邻近的解,然后再使用比较精确的算法在这个解附近查找最优值.

发表回复

您的电子邮箱地址不会被公开。