python - 广义加性模型 - Python

标签 python curve-fitting spline gam

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

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

如果样条线的数量选择不正确,那么我会得到不正确的拟合。

请给我一些准确选择样条线数量的方法建议。

最佳答案

通常,对于样条线,您会选择相当多的样条线 (~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-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 值(时间)进行密集的线性间隔。这样做的原因是为了可视化学习模型将如何插值。

关于python - 广义加性模型 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879954/

相关文章:

python - 在类实例化期间干净地处理问题

python - 如何调用产生的函数(python 2.7)

python - matplotlib - 运行时在事先不知道的情况下添加多行

python - 将 scipy.optimize.curve_fit 与权重一起使用

python-3.x - 我应该如何使用单变量样条曲线来拟合特定形状的数据?

python - 如何从使用 scipy.interpolate.Rbf 创建的样条曲线计算任意值?

python - 如何在 RPy 中使用 smooth.spline 的 lambda 参数而无需 Python 将其解释为 lambda

python - 改进Python代码读取文件

python - 如何解决一维数据拟合不良的问题?

algorithm - 什么算法确定点与贝塞尔曲线的接近程度?