广义加法模型 - Python

问题描述 投票:1回答:1

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

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

This is the expected result

Original data scatter plot

如果没有正确选择样条曲线的数量,那么我的拟合不正确。

请,我想建议一些方法来准确选择样条数。

python curve-fitting spline gam
1个回答
3
投票

通常,对于样条曲线,您可以选择相当多的样条曲线(~25),并且让lambda平滑参数可以降低模型的灵活性。

对于你的用例,我会选择默认的n_splines=25然后对lambda参数lam进行gridsearch以找到最佳的平滑量:

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

这将尝试从lam = 1e-31e3的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值(时间)进行密集的线性间距。这样做的原因是可视化学习模型的插值方式。

© www.soinside.com 2019 - 2024. All rights reserved.