我正在努力为我的数据点获得平滑的曲线。 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平滑后,我得到了蓝线,而我需要像我所示的红色图(没有局部极值)
答案 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()