使用gnuplot拟合直线

3
我希望您能够使用gnuplot来获取多条曲线的一次多项式方程(F(x)=a*x+b)的拟合参数。其中一些曲线是直线。
例如,如果我的数据如下:
1 1
2 2
3 3
4 4

这可以用 f(x)=x (param a=0, b=0) 表示。

但以下的 gnuplot 代码

# regression line
f(x) = a*x + b
fit f(x) './test.dat' u 1:2  via a, b

无法计算拟合参数,出现以下错误信息。
Singular matrix in Invert_RtR

更新:看起来如果我为拟合函数定义迭代次数,gnuplot就不会“崩溃”

FIT_MAXITER = 1
# regression line
f(x) = a*x + b
fit f(x) './test.dat' u 1:2  via a, b

应该是a=1,b=0。但gnuplot给出的结果是:

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

a               = 0.989067         +/- 0.004339     (0.4387%)
b               = 0.0761393        +/- 0.02692      (35.36%)

我该如何“强制”gnuplot计算出正确的a和b值?

3个回答

4
我找到了两个解决方案:
1)在您的拟合函数中添加一个微小的偏移量:
f(x) = a*x + b + 1e-9

这可以避免奇异问题,并得到完全正确的拟合结果(a = 1,b=-1e-9)。
2)完全消除b参数。
f(x) = a*x

这是基于所有拟合线都经过0的假设,当然这可能不是您想要的。

任何偏移量都可以。问题不在于精确匹配,而在于变量b趋近于零。 - Karl

3
我看问题可能是因为f(x)完美地适应了数据。如果您向任何数据中添加任何非零值,则不会出现错误。在现实生活中,这种完美拟合是不可能的(您会有噪音)。无论如何,尽管gnuplot说“fit中出现错误”,但似乎gnuplot已经正确地拟合了函数。
通过添加FIT_MAXITER = 1来解决问题可能是一种变通方法。您为FIT_MAXITER定义的值越高,拟合效果就越好。但是,如果您为其设置过高的值,则拟合将是完美的(误差将小于数字精度)。
尝试对您的真实数据进行f(x)拟合,并告诉我们您得到的结果!

很抱歉,答案是错误的。问题在于参数趋近于零。为了使算法正常工作,参数必须具有大致相同的数量级。Gnuplot通过预缩放参数来帮助解决这个问题,但当参数趋近于零时,这种方法显然会失败。 - Karl

0

你有两个选择,我建议选择第一个:

  • 将变量b替换为(b+n),然后从结果中减去固定变量n(可以是1或任何其他不是非常小或非常大的任意值)。这样$b$就不会消失,gnuplot算法将成功拟合并退出而不会出现错误消息。相反,它只会显示一个通知,说“嗯....平方残差和为零。无法计算误差。”

  • b一个非常小的起始值。Gnuplot对其内部代表的$b$进行预缩放,使拟合在误差出现之前收敛。

拟合的一般规则:您的参数需要具有相同的数量级,并且需要初始化为正确的数量级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接