这是一个典型的问题,可以用
ODL
:
import odl
import numpy as np
m = 2
p = 100
lam = 0.00001
# Define B
B = odl.MatrixOperator(np.random.rand(p, m + p))
alpha_true = np.random.rand(m + p)
y = B(alpha_true)
# Define functionals
l2dist = odl.solvers.L2NormSquared(B.range) * (B - y)
l1 = lam * odl.solvers.L1Norm(B.domain)
func = l2dist + l1
# Initial point
alpha = B.domain.zero()
# Solve using steepest descent
odl.solvers.steepest_descent(func, alpha,
line_search=0.0003, maxiter=10000,
callback=lambda x: print(func(x)))
如果你想要一个更快的解决方案,你应该研究最近的方法(也可以在ODL中找到)。FISTA方法就是这样一个例子:
import odl
import numpy as np
m = 2
p = 100
lam = 0.00001
# Define B
B = odl.MatrixOperator(np.random.rand(p, m + p))
alpha_true = np.random.rand(m + p)
y = B(alpha_true)
# Define functionals
l2dist = odl.solvers.L2NormSquared(B.range) * (B - y)
l1 = lam * odl.solvers.L1Norm(B.domain)
func = l2dist + l1
# Use FISTA
alpha = B.domain.zero()
odl.solvers.accelerated_proximal_gradient(alpha, l1, l2dist,
gamma=0.0001, niter=1000,
callback=lambda x: print(func(x)))