2017-08-05 6 views
2

J'essaye de résoudre la fonction d'optimisation de lasso ci-dessous par la méthode des moindres carrés régularisés L1. J'utilise python pour mon projet.L1 Régularité des moindres carrés

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

Ici α'* est un vecteur. Dimension de B’=(m+p)*p, y’=(m+p)*1, α‘=p*1

Je n'ai pas pu résoudre cette équation. S'il vous plaît, n'importe qui expliquer le eqn et la méthode pour résoudre cet eqn dans la méthode des moindres carrés régularisée L1.

+0

Est question demandant la mise en œuvre de la programmation ou recherchez-vous une explication mathématique? –

+0

Je demande la mise en œuvre. J'écris un programme pour imputer des valeurs manquantes dans un ensemble de données donné en utilisant la méthode de représentation de réserve limitée par Localité. Dans le cadre de cette méthode, j'ai besoin de trouver le vecteur de coefficient en résolvant l'équation ci-dessus. Mais je ne pouvais pas obtenir comment résoudre l'Eqn ci-dessus. – dinesh12

+0

Vous pouvez essayer d'utiliser sympy: http://www.scipy-lectures.org/advanced/sympy.html Bien que je ne suis pas sûr de la complexité qu'il peut gérer –

Répondre

0

Ceci est un problème typique qui peut résoudre avec 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))) 

Si vous voulez une solution plus rapide, vous devriez regarder dans les méthodes proximales (également disponible en EOD). Un tel exemple est la méthode 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

Merci, Jonas ... Mais je suis confronté à un problème de dimension ici ... J'ai des matrices B et y. Ma dimension B est (m + p) * p (pas (m * p)) et y est p * 1 ... Par exemple, B est 102 * 100 et y est 100 * 1, Lorsque vous exécutez ce code, je suis face à l'erreur suivante, "OpTypeError:' range' rn (144) de l'opérateur droit OperatorVectorSum (MatrixOperator() pas égal au domaine rn (142) de l'opérateur gauche L2NormSquared (rn (142)) " – dinesh12

+0

S'il vous plaît aidez-moi à résoudre ce problème – dinesh12

+0

Merci d'avoir mentionné cela, j'ai mis à jour la réponse pour suivre votre convention de près et cela fonctionne maintenant comme prévu –