2017-08-05 88 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

謝謝你提到這一點,我更新了答案,嚴格按照你的約定,現在按預期工作 –