2017-08-05 89 views
2

我想通过L1正则化最小二乘法解决以下拉索优化功能。我为我的项目使用python。L1正则化最小二乘法

α'* = arg min (||y’–B’α’||_2^2 + λ||α’||_1) 

这里α'*是一个载体。尺寸B’=(m+p)*p,y’=(m+p)*1,α‘=p*1

我无法解决这个方程。请任何人解释eqn和解决这个公式的方法L1正则化最小二乘法。

+0

是询问编程实现的问题还是您在寻找数学解释? –

+0

我要求实施。我正在编写一个程序,用于使用局部性约束备用表示方法来输入给定数据集中的缺失值。作为这种方法的一部分,我需要通过求解上面的公式来找到系数向量。但我无法得到如何解决上述公式。 – dinesh12

+0

您可以尝试使用sympy:http://www.scipy-lectures.org/advanced/sympy.html 虽然我不知道它可以处理 –

回答

0

这是可以与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))) 
+0

谢谢,乔纳斯......但我在这里面临维度问题......我有B和y矩阵。我的B维是(m + p)* p(不是(m * p)),y是p * 1 ...例如,B是102 * 100,y是100 * 1,运行此代码时,我面向以下错误,“右操作符OperatorVectorSum(MatrixOperator())不等于左操作符L2NormSquared(rn(142))的域rn(142)的OpTypeError:'range(144)” – dinesh12

+0

请帮助我解决这个问题 – dinesh12

+0

谢谢你提到这一点,我更新了答案,严格按照你的约定,现在按预期工作 –