如何在gnuplot中实现线性外推



无法进行正确的线性外推。这是图表。

这是的图形

很明显,外推应该减少,因为左边的点在顶部,右边的点都在底部,而且有很多。示例数据。

1.12.2010;6700
5.12.2010;330000
8.12.2010;45300
12.12.2010;15400
5.05.2011;5300
31.05.2011;1500
2.06.2011;11400
24.11.2011;51000
19.03.2012;3300
....

我用下面的脚本画了这张图。

#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "result.ps"
set grid xtics ytics
set datafile separator ";"
set xtics rotate by 45 right
set grid xtics ytics
set xdata time
set timefmt "%d.%m.%Y"
# The equation
f(x) = a*x + b
fit f(x) "q.csv" u 1:2 via a,b
plot "q.csv" using 1:2 title "DATA" with p linestyle 3 lt 7 lw 2, 
f(x) w l lt 1 lw 2 title "trendline"

以下是在许多地方描述的进行线性外推的部分。例如,在这里。就好像逻辑规定它应该起作用,但不起作用。。。

# The equation
f(x) = a*x + b
fit f(x) "q.csv" u 1:2 via a,b

我做错了什么?

我测试了它。尝试了那里提供的东西,但对我没有帮助。我就是这样做的。

# find out the StartDate
StartDate = "1.12.2010"          # manually by setting a value
f(x) = a*(x-StartDate) + b
set fit brief nolog
b=10
fit f(x) "q.csv" u 1:2 via a,b
set key top left
set format x "%d.%m.%Y" timedate
plot "q.csv" u 1:2 ti "Data" with linespoints linestyle 1 pt 7 ps 1, 
f(x) w l lc rgb "red" ti "Fit"

结果

但在exel 中

拟合失败的主要原因是:(1(一般的Marquardt Levenberg算法不是解决线性最小二乘问题的最佳算法;(2(ab的最终解相差几个数量级。

对于处理(2(,您可以对ab的初始值进行实验,尝试

a = 0.001
b = 150000

这应该会有所帮助。但如果不是,则可以通过";转换";在运行fit命令之前,Marquardt Levenberg将以下变量设置为一步高斯-牛顿(参见help set fithelp fit control variables了解gnuplot的旧版本(:

set fit lambda_factor 1
set fit start_lambda 0.00001
### or for older versions of gnuplot
# FIT_START_LAMBDA=0.00001
# FIT_LAMBDA_FACTOR=1

请注意,gnuplot仍然需要两个步骤:一个是查找解决方案,另一个是验证它是否已经收敛。


正如@theozh所指出的,通过使用f(x) = a*(x-StartDate) + b来移动x值通常是有帮助的。它还可能有助于缩放以下参数:f(x) = 1000*a*x+b/1000。或者可以尝试将两者结合,或者。。。

相关内容

  • 没有找到相关文章