我正在尝试使用广义加性模型来拟合非线性模型。如何确定要使用的样条线数量。有没有特定的方法来选择样条线的数量?我使用了三阶(三次)样条拟合。下面是代码。
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()
这是预期的结果
原始数据散点图
如果样条线的数量选择不正确,那么我会得到不正确的拟合。
请给我一些准确选择样条线数量的方法建议。
最佳答案
通常,对于样条线,您会选择相当多的样条线 (~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 值(时间)进行密集的线性间隔。这样做的原因是为了可视化学习模型将如何插值。
关于python - 广义加性模型 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879954/