使用numpy平滑没有局部极值的曲线

时间:2018-03-21 14:52:59

标签: python numpy curve-fitting

我正在努力为我的数据点获得平滑的曲线。 Say(lin_space,rms)是我需要绘制的有序对。对于以下代码 -

spl=UnivariateSpline(lin_space,rms)
x=np.arange(0,1001,0.5)    
plt.plot(lin_space,rms,'k.')
plt.plot(lin_space,spl(lin_space),'b-')
plt.plot(x,np.sqrt(x),'r-')

使用UnivariateSpline平滑后,我得到了蓝线,而我需要像我所示的红色图(没有局部极值)

enter image description here

1 个答案:

答案 0 :(得分:0)

您需要更有限的一类模型。

对于您显示的数据,一个选项是使用平方根函数进行最小二乘。这应该会产生良好的效果。

运行平均值将是平滑的(呃),具体取决于您对术语的权重。

使用RBF + WhiteNoise内核的高斯过程回归可能值得检查,并且在RBF内核的长度范围内具有适当的先验界限。 OTOH,你的残差不是正态分布的,所以这个模型可能不适用于边缘的值。

注意:如果您特别想要一个没有局部极值的函数,则需要选择具有该属性的一类模型。例如拟合平方根函数。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import sklearn.linear_model
mpl.rcParams['figure.figsize'] = (18,16)

WINDOW=30
def ma(signal, window=30):
    return sum([signal[i:-window+i] for i in range(window)])/window


X=np.linspace(0,1000,1000)
Y=np.sqrt(X) + np.log(np.log(X+np.e))*np.random.normal(0,1,X.shape)
sqrt_model_X = np.sqrt(X)
model = sklearn.linear_model.LinearRegression()
model.fit(sqrt_model_X.reshape((-1,1)),Y.reshape((-1,1)))

plt.scatter(X,Y,c='b',marker='.',s=5)
plt.plot(X,np.sqrt(X),'r-')
plt.plot(X[WINDOW:],ma(Y,window=WINDOW),'g-.')
plt.plot(X,model.predict(sqrt_model_X.reshape((-1,1))),'k--')
plt.show()

MSDN