我试图在pytorch中实现baseline als减法,这样我就可以在我的GPU上运行它,但是我遇到了一些问题,因为皮托奇.gesv给出的结果与西皮.linalg.spsolve. 这是我为scipy编写的代码:
def baseline_als(y, lam, p, niter=10):
L = len(y)
D = sparse.diags([1,-2,1],[0,-1,-2], shape=(L,L-2))
w = np.ones(L)
for i in range(niter):
W = sparse.spdiags(w, 0, L, L)
Z = W + lam * D.dot(D.transpose())
z = spsolve(Z, w*y)
w = p * (y > z) + (1-p) * (y < z)
return z
这是我的密码
^{pr2}$抱歉,Pythorch代码看起来很糟糕,我才刚开始。在
我已经确认了,对于scipy和pytorch来说Z,w,y都是一样的,在我试图解方程组之后,它们之间的Z是不同的。在
感谢您的评论,下面是一个例子:
我用10万计算lam,0.001计算p
使用虚拟输入:y=(5,5,5,5,5,10,10,5,5,5,5,10,10,10,10,10,5,5,5,5,5,5)
我从scipy得到(3.68010263,4.90344214,6.12679489,7.35022406,8.57384278,9.79774074,11.021971199,12.2465927,13.47164891,14.69711435,15.92287813,17.14873257,18.37456982,19.60038184,20.82626043,22.0521557,23.27805103,24.50400438,25.73010693,26.95625922)
(6.4938312、6.46912395、6.44440175、6.41963499、6.39477958、6.36977727、6.34455582、6.31907933、6.29334844、6.26735058、6.24106029、6.21443939、6.18748732、6.16024137、6.13277694、6.10515785、6.07743658、6.04965455、6.02184242、5.99402035)。在
这只是循环的一次迭代。西皮是对的,皮托克不是。在
有趣的是,如果我使用一个较短的虚拟输入(5,5,5,5,10,10,5,5,5,5),两者的答案都是一样的。我的实际输入是1011维。在
你的pytorch函数是错误的(你从来没有在for循环的第一行更新
W
),而且我得到了你说的从Scipy得到的pytorch的结果。在Scipy版本
相当于Pythorch
^{pr2}$当我用
y = np.array([5,5,5,5,5,10,10,5,5,5,10,10,10,5,5,5,5,5,5,5], dtype='float64')
喂它们时:西皮:
Pythorch公司:
如果我将
n_iter
增加到10:西皮:
Pythorch公司:
它与你在问题中链接的基线als的代码相匹配。在
相关问题 更多 >
编程相关推荐