Python中数据点的平均趋势曲线

2 投票
3 回答
7755 浏览
提问于 2025-04-16 22:52

我想画一个类似这样的图:


(来源: brleader.com)

我的意思是,我有一组数据点,想要画出一条显示平均趋势的曲线。

我试着在函数y=2x上加了一些随机噪声。

  from scipy import interpolate

  x=arange(0,1,1e-3)
  noise=np.random.random(len(x))
  y=2*x+noise

然后我用了一些脚本函数来插值数据。

  xnew=arange(0,1,1e-1)
  f=interpolate.UnivariateSpline(x,y)
  g=interpolate.interp1d(x,y)
  plot(x,y,'ro',xnew,f(xnew),'-',xnew,g(xnew),'--')
  show()

但是我得到的曲线和y=2*x几乎没有相似之处。我希望能有一条平滑的曲线来表示数据的平均值。我可以用什么方法或函数呢?

3 个回答

0

在这里输入图片描述

单变量的图像看起来就像是2x+0.5(这其实是你噪声的平均值)。

可以预见,interp1d在这么多噪声的情况下变化会这么大。

根据你的需求,你可能想自己写一个移动平均,而不是使用现成的插值方法;移动平均就是用最近n个数据点的平均值来代替某个数据点。

不过,使用哪种插值方法也要看你的具体需求。试试几种方法,选择最适合你的那一种。

2

你可以试试 fit.py,这是一个用于Python的曲线拟合工具。

4

曲线看起来不像 y=2*x 的一个原因(我觉得它看起来像,但这只是个人观点)是因为你的噪声相对于 y 的平均变化来说太大了。如果你尝试做一些事情,比如:

noise=0.1*np.random.random(len(x))

(也就是说,减少噪声)或者

y=5*x**2+noise

(也就是说,增大 y 的变化),你会发现插值能更好地跟踪数据。

你可能还想看看:

http://www.scipy.org/Cookbook/SignalSmooth

撰写回答