我找到了问题的答案,只是为每个偶然发现这个问题的人分享。
P. Eilers和H. Boelens在2005年提出了一种叫做 "非对称最小二乘法平滑 "的算法。该论文是免费的,你可以在谷歌上找到它。
def baseline_als(y, lam, p, niter=10):
L = len(y)
D = sparse.csc_matrix(np.diff(np.eye(L), 2))
w = np.ones(L)
for i in xrange(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