我現在正在嘗試學習LASSO迴歸的ADMM算法(Boyd 2010)。Matlab和Python中LASSO迴歸結果不同
我在page上發現了一個很好的例子。
該matlab代碼顯示爲here。
我試圖將它轉換成Python語言,以便我可以開發更好的理解。
下面是代碼:
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)
我已經找到了丟失的功能後,100多個迭代沒有收斂。矩陣B不傾向於稀疏,另一方面,matlab代碼適用於不同的情況。
我檢查了不同的輸入數據,並與Matlab輸出進行比較,但我仍然無法獲得提示。
有人可以試試嗎?
預先感謝您。
請通過添加*完整*示例來更好地解決這個問題,特別是包括傳遞給函數的X,A和伽馬值。你說你使用了各種各樣的,但至少提供一套,以便其他人可以快速檢查你的代碼。 (-1不是我) – Unapiedra 2014-09-03 16:13:09
感謝您的評論。我用兩個輸入文件來測試上面的代碼。請參閱[C.mat](https://www.dropbox.com/s/g0vb3s3cib614pm/C.mat?dl=0)和[lasso.mat](https://www.dropbox.com/s/57ia207tjzp4ic6/ lasso.mat?DL = 0)。請注意,這個版本與原始Matlab代碼有些不同,後者使用隨機矩陣。 – SpencerLo 2014-09-03 18:23:25