如何解决fx= a * x的Gnuplot线性拟合
我有以下数据集:
0 6
25 27
91 25
160 21
190 32
335 28
如何绘制y=ax + 6
形式的线性回归,以便线包含点(0,6)
?我尝试了以下代码:
f(x) = a*x +6
fit f(x) "data.txt" u 1:2 via a
plot "data.txt" u 1:2 w p pt 7,f(x) w l
较高点的距离之和大于较低点的距离(实际上,我们仅看到一个较低点:(335,28))。如何拟合f(x)以使距离之和相等?
解决方法
使用gnuplot拟合是最小二乘拟合,即该算法将数据点与f(x)
之间的差异的平方和最小化(选中help fit
)。
相比之下,显然您正在寻找对数据点与f(x)
之间的差求和并试图使总和为零的方法。不一样。
只要您的函数像a*x+b
一样简单,就可以使用stats
来计算直线的斜率。
代码:
### different ways of "fitting"
reset session
$Data <<EOD
0 6
25 27
91 25
160 21
190 32
335 28
EOD
b = 6
f(x) = a0*x + b
# least square fit
set fit nolog quiet
fit f(x) $Data u 1:2 via a0
# make sum of difference to h(x) to zero
stats $Data u 1:2 nooutput
h(x) = a1*x + b
a1 = (STATS_sum_y - STATS_records*b)/STATS_sum_x
set key top left
plot $Data u 1:2 w p pt 7,\
f(x) w l ti sprintf("Least square fit: f(x)=a0*x+b,a0=%g",a0),\
h(x) w l ti sprintf("Sum of differences to zero: h(x)=a1*x+b,a1=%g",a1),\
$Data u 1:2:(0):(h($1)-$2) w vectors lc "red" nohead ti "Differences to h(x)"
### end of code
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。