我尝试使用广义附加模型拟合非线性模型。如何确定要使用的样条线数量。是否有特定的方法来选择样条曲线的数量?我使用了三阶(立方)样条拟合。以下是代码。
from pygam import LinearGAM
from pygam.utils import generate_X_grid
# Curve fitting using GAM model - Penalised spline curve.
def modeltrain(time,value):
return LinearGAM(n_splines=58,spline_order=3).gridsearch(time, value)
model=modeltrain(t1,x1)
# samples random x-values for prediction
XX = generate_X_grid(model)
#plots for vizualisation
plt.plot(XX, model.predict(XX), 'r--')
plt.plot(XX, model.prediction_intervals(XX,width=0.25), color='b', ls='-- ')
plt.scatter(t1, x1)
plt.show()
如果没有正确选择样条曲线的数量,那么我的拟合就不合适了。
请,我想建议一些方法来准确选择样条线数。
答案 0 :(得分:3)
通常,对于样条线,您可以选择相当多的样条线(~25),并让lambda
平滑参数执行降低模型灵活性的工作。
对于您的用例,我会选择默认的n_splines=25
然后对lambda参数lam
进行网格搜索,以找到最佳的平滑量:
def modeltrain(time,value):
return LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, lam=np.logspace(-3, 3, 11))
这将尝试从lam = 1e-3
到1e3
的11个模型。
我认为您选择的n_splines=58
太高了,因为它看起来像每个数据点生成一个样条线。
如果您真的想要通过n_splines
进行搜索,那么您可以这样做:
LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, n_splines=np.arange(50))
注意:函数generate_X_grid
不会对预测进行随机抽样,它实际上只会使您的X值(时间)产生密集的线性间距。这样做的原因是可视化学习模型的插值方式。