J'essaie maintenant d'apprendre l'algorithme ADMM (Boyd 2010) pour la régression LASSO. J'ai découvert un très bon exemple sur ce page. Le code matlab est indiqué here. J'ai essayé de le convertir en langage Python pour que je puisse développer une meilleure compréhension.Résultat de régression LASSO différent dans Matlab et Python
Voici le code:
import scipy.io as io
import scipy.sparse as sp
import scipy.linalg as la
import numpy as np
def l1_norm(x):
return np.sum(np.abs(x))
def l2_norm(x):
return np.dot(x.ravel().T, x.ravel())
def fast_threshold(x, threshold):
return np.multiply(np.sign(x), np.fmax(abs(x) - threshold, 0))
def lasso_admm(X, A, gamma):
c = X.shape[1]
r = A.shape[1]
C = io.loadmat("C.mat")["C"]
L = np.zeros(X.shape)
rho = 1e-4
maxIter = 200
I = sp.eye(r)
maxRho = 5
cost = []
for n in range(maxIter):
B = la.solve(np.dot(A.T, A) + rho * I, np.dot(A.T, X) + rho * C - L)
C = fast_threshold(B + L/rho, gamma/rho)
L = L + rho * (B - C);
rho = min(maxRho, rho * 1.1);
cost.append(0.5 * l2_norm(X - np.dot(A, B)) + gamma * l1_norm(B))
cost = np.array(cost).ravel()
return B, cost
data = io.loadmat("lasso.mat")
A = data["A"]
X = data["X"]
B, cost = lasso_admm(X, A, gamma)
J'ai trouvé la fonction de perte n'a pas convergé après 100+ itérations. La matrice B n'a pas tendance à être éparse, par contre, le code matlab a fonctionné dans différentes situations.
J'ai vérifié avec différentes données d'entrée et comparé avec les sorties Matlab, mais je n'ai toujours pas pu obtenir d'indices.
Quelqu'un pourrait-il essayer?
Merci d'avance.
Veuillez améliorer cette question en incluant un exemple * complet *, incluant notamment les valeurs de X, A et gamma transmises à votre fonction. Vous dites que vous avez utilisé divers, mais fournissez au moins un ensemble, afin que d'autres puissent rapidement vérifier votre code. (-1 n'était pas de moi) – Unapiedra
Merci pour votre commentaire. J'ai utilisé deux fichiers d'entrée pour tester le code ci-dessus. Voir [C.mat] (https://www.dropbox.com/s/g0vb3s3cib614pm/C.mat?dl=0) et [lasso.mat] (https://www.dropbox.com/s/57ia207tjzp4ic6/ lasso.mat? dl = 0). Notez que cette version est un peu différente du code Matlab original pour ce dernier utilise une matrice aléatoire. – SpencerLo