Python中数据点的平均趋势曲线
我想画一个类似这样的图:
(来源: 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
的变化),你会发现插值能更好地跟踪数据。
你可能还想看看: