在Ridge迴歸中,我們正在求解Ax=b
與L2
正則化。直接計算由下式給出:嶺迴歸:Scikit學習與直接計算不匹配的alpha> 0
X =(A Ť A +阿爾法* I)-1甲Ť b
我已經看過的scikit學習代碼他們確實執行相同的計算。但是,我似乎無法得到相同的結果alpha > 0
重現此最小代碼。
import numpy as np
A = np.asmatrix(np.c_[np.ones((10,1)),np.random.rand(10,3)])
b = np.asmatrix(np.random.rand(10,1))
I = np.identity(A.shape[1])
alpha = 1
x = np.linalg.inv(A.T*A + alpha * I)*A.T*b
print(x.T)
>>> [[ 0.37371021 0.19558433 0.06065241 0.17030177]]
from sklearn.linear_model import Ridge
model = Ridge(alpha = alpha).fit(A[:,1:],b)
print(np.c_[model.intercept_, model.coef_])
>>> [[ 0.61241566 0.02727579 -0.06363385 0.05303027]]
對於我能做些什麼來解決這種差異有什麼建議嗎?
感謝您的詳細答覆。這確實解決了'fit_intercept = False'。然而,在我的例子中,我確實需要'intercept',因此我在直接計算中將1的列添加到我的'A'矩陣中。當我通過使用'A [:,1:]'傳遞給'Ridge'時,我放下1的列。所以即使我運行'model = Ridge(alpha = alpha,normalize = False,fit_intercept = True,solver =「cholesky」)。fit(A [:,1:],b)' - 我無法獲得相同的結果。什麼時候你想'fit_intercept = True'的澄清? – amitkaps
我相信你仍然可以保持行'A = np.asmatrix(np。c_ [np.ones((10,1)),np.random.rand(10,3)])'並設置'fit_intercept = False'。第一個係數不應該是攔截嗎? – JARS
是的 - 就是這樣!應該想到它。仍然想知道爲什麼'normalize = False,fit_intercept = True'的做法不一樣。感謝你的幫助。 – amitkaps