2017-08-25 294 views
0

我正在尝试使用广义相加模型拟合非线性模型。如何确定要使用的样条线数量。是否有特定的方式来选择样条的数量?我已经使用了三阶(立方)样条拟合。以下是代码。广义相加模型 - Python

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() 

这是预期的结果

enter image description here

原始数据散点图

enter image description here

如果未正确选择花键的数量,然后我得到一个不正确拟合。

请,我想建议的方法来精确选择样条数。

回答

1

通常对于样条曲线,选择相当多的样条曲线(〜25),并让平滑参数完成降低模型灵活性的工作。

为您的使用情况,我会选择默认n_splines=25,然后做一个gridsearch在拉姆达参数lam找到平滑的最佳用量:

def modeltrain(time,value): 
    return LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, lam=np.logspace(-3, 3, 11)) 

这将尝试11款从lam = 1e-31e3

我认为你的选择n_splines=58太高了,因为它看起来像是每个数据点产生一个样条曲线。

如果你真的想做超过n_splines搜索,那么你可以这样做:

LinearGAM(n_splines=25,spline_order=3).gridsearch(time, value, n_splines=np.arange(50)) 

注:功能generate_X_grid不进行预测做随机抽样,它实际上只是让一个稠密线性 - 你的X值的时间(时间)。其原因是想象学习模型将如何插值。