pyGAM中导数的计算

问题描述

我想计算拟合 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 (将#修改为@)