如何将pygam模型转换为SciPy BSpline

如何将pygam模型转换为SciPy BSpline,scipy,gam,model-fitting,pygam,Scipy,Gam,Model Fitting,Pygam,我想得到两个世界中最好的:Scipy和pygam。 具体来说,我想使用一个自定义pygam惩罚函数惩罚数据的三阶导数,然后我想将结果用作Scipy BSpline。后者允许轻松计算数据的第n阶导数。 当然,gam.coef给了我模型的系数,但是结是什么呢? 如果通过使用gam.terms.get_coef_index()-1接近,那么结果应该与gam.predict(x)完全相同,即 在ev br提供了一个有用的注释之后,我们现在知道我们可以通过pygam.utils.get\u knot\u

我想得到两个世界中最好的:Scipy和pygam。 具体来说,我想使用一个自定义pygam惩罚函数惩罚数据的三阶导数,然后我想将结果用作Scipy BSpline。后者允许轻松计算数据的第n阶导数。 当然,
gam.coef
给了我模型的系数,但是结是什么呢? 如果通过使用
gam.terms.get_coef_index()-1
接近,那么结果应该与
gam.predict(x)
完全相同,即

在ev br提供了一个有用的注释之后,我们现在知道我们可以通过
pygam.utils.get\u knot\u edges
获得结边。因此,一段有前途的代码是

plt.figure()
res0=pygam.LinearGAM(terms=pygam.terms.s(0),n_splines=len(x),penalties=MyPenalty,lam=0.3,fit_intercept=False, basis='ps').fit(x,y,1/np.sqrt(w))
plt.plot(x,y,'x',zorder=10, label='data')
knot_edges=utils.gen_edge_knots(x,dtype='numerical')
knots=np.linspace(knot_edges[0],knot_edges[-1],len(res0.coef_))
plt.plot(x,res0.predict(x), label='PyGAM fit')
plt.plot(x,scipy.interpolate.BSpline(knots,res0.coef_,3)(x), label='BSpline from PyGAM parameters')
   
    
plt.legend()
唉,结果不是很令人满意:

根据,pyfam适合统一的结。第一个和最后一个结的位置可以通过
pygam.utils.gen_edge_knots

提取,根据,pyfam适合统一的结。第一个和最后一个结的位置可以通过
pygam.utils.gen_edge_knots
提取,谢谢。然而,我已经走上了正确的道路。更新了问题。很好的提示,谢谢。然而,我已经走上了正确的道路。更新了问题。