微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pyGAM中导数的计算

如何解决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)

要恢复 y1x0@a.coefs_ 效果很好。 为了得到我有的导数 der2=x[:,1:]@(a.coef_[1:]-a.coef_[:-1])/((edges[1]-edges[0])/(len(a.coef_)))

我也尝试过这种方法的各种变体,但无法得到令人满意的解决方案 (2*x1)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。