我的一个 friend 在gnuplot中发现了一些关于简单多项式拟合的奇怪行为,某人可以解释一下吗?
这是文件:
#!/usr/bin/gnuplot -p
f(x) = B*(x**4) + A
fit f(x) "data.txt" using ($1+273.14):2 via A, B
plot "data.txt" using ($1+273.14):2 notitle,\
f(x) notitle
数据为:
# content of data.txt
350 3.856
330 3.242
290 2.391
250 1.713
210 1.181
170 0.763
130 0.437
结果图为绿线。蓝线表示使用基本相同形式的另一种功能拟合得更好。对于绿线,A替换为常数(A = 0.2123,大约为B * 300 ^ 4)
因此,绿线显然不是最佳拟合方法,因为
f(x) = B*(x**4) - 0.2123
产生的结果要好得多,并且格式也为B * x 4 +A。拟合算法。为A和B设置不同的初始值似乎无济于事-A的值不会因其初始值而改变。我和我的 friend 使用的是Ubuntu随附的标准Gnuplot版本:gnuplot 4.4补丁程序级别3。 最佳答案
这是一个很好的(涉及的)问题,我没有一个完整的答案,但是希望以下内容能启发您。
Fit使用最小二乘拟合例程(Levenberg–Marquardt)。迭代地收敛于一个“好的”解决方案。由FIT_LIMIT
变量确定所需的解决方案的质量。默认情况下,FIT_LIMIT设置为(保守的)1.e-5
。显然,与更改A相比,通过更改迭代路由中的B值,您的数据收敛得更快。实际上,正如您已经注意到的那样,即使不接触变量A,也可以达到错误阈值。达到您的期望(您希望获得更好的拟合度,因此将FIT_LIMIT
设置为较低的值-我将其设置为1.e-14
),您会得到更好的结果。您在这里付出的代价是,收敛可能需要更长的时间才能收敛(或者甚至会发散-我不是拟合专家)。这里的一个要点是,功能拟合更像是一门艺术,而不是一门科学,而且没有最佳拟合,只有足够好的拟合。
还要注意,该算法搜索残差平方的局部最小值(满足您给出的公差)。它不能保证找到全局最小值。
#!/usr/bin/gnuplot -p
FIT_LIMIT=1.e-14
f(x) =A + B*(x**4)
fit f(x) "data.txt" using ($1+273.14):2 via A, B
plot "data.txt" using ($1+273.14):2 notitle,\
f(x) notitle
还要注意,如果您发现gnuplot收敛在错误的最小值上,则可以通过执行以下操作“播种”拟合例程:
FIT_LIMIT=1.e-14
f(x) =A + B*(x**4)
A=1.3 #initial guess for A
fit f(x) "data.txt" using ($1+273.14):2 via A, B
plot "data.txt" using ($1+273.14):2 notitle,\
f(x) notitle
关于Gnuplot在多项式拟合中表现得很奇怪。这是为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11073925/