无法进行正确的线性外推。这是图表。
这是的图形
很明显,外推应该减少,因为左边的点在顶部,右边的点都在底部,而且有很多。示例数据。
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(a
和b
的最终解相差几个数量级。
对于处理(2(,您可以对a
和b
的初始值进行实验,尝试
a = 0.001
b = 150000
这应该会有所帮助。但如果不是,则可以通过";转换";在运行fit
命令之前,Marquardt Levenberg将以下变量设置为一步高斯-牛顿(参见help set fit
或help 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
。或者可以尝试将两者结合,或者。。。