问题描述
我想计算拟合 GAM 模型 a
在 pyGAM 中特定点的导数。该模型只包含样条项,因此它应该是一个有效的 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,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],spline_order=2,periodic=False)
要恢复 y1
:[email protected]_
效果很好。
为了得到我有的导数
der2=x[:,1:]@(a.coef_[1:]-a.coef_[:-1])/((edges[1]-edges[0])/(len(a.coef_)))
我也尝试过这种方法的各种变体,但无法得到令人满意的解决方案 (2*x1
)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)