我想在pyGAM中计算一个拟合的GAM模型a在特定点的导数。该模型只包含样条项,因此它应该是一个有效的BSpline。
实际上,使用pygam.utils.b_spline_basis可以得到一个矩阵,我可以将该矩阵与a.coefs相乘,以从a.predict恢复pyGAM预测。这个想法是使用BSpline的解析导数来获得导数。有关更多信息,请参阅here或直接使用维基百科的BSpline文章。
我想出了这个:
def GetGAM(x,y,err):
if len(x)>5:
gam=pygam.LinearGAM(pygam.s(0, n_splines=len(x)),penalties=__PenaltyD3,lam=0,fit_intercept=False)
gam=gam.fit(x,y, weights=1/err)
#print('done')
return gam
x1 = np.linspace(0,50,10)
y1=x1**2
err=np.ones(10)
a = GetGAM(x1,y1,err)
x0=pygam.utils.b_spline_basis(x1,pygam.utils.gen_edge_knots(x1,'numerical'),spline_order=3,n_splines=len(a.coef_), periodic=False)
x=pygam.utils.b_spline_basis(x1,pygam.utils.gen_edge_knots(x1[:-1],'numerical'),spline_order=2,n_splines=len(a.coef_), periodic=False)要恢复y1:x0@a.coefs_工作得很好。为了得到导数,我有der2=x[:,1:]@(a.coef_[1:]-a.coef_[:-1])/((edges[1]-edges[0])/(len(a.coef_)))
我也尝试过它的各种变体,但无法得到令人满意的解决方案(2*x1)。
发布于 2021-10-28 15:07:46
我回答了一个相关的问题,并提出了一种数值方法,用于获得符合数据的pygam的导数。以下是可能满足您的要求的链接:
https://stackoverflow.com/questions/65968289
复制相似问题