2016-10-11 71 views
2

當我學習Python SKlearn時,遇到的第一個示例是Generalized Linear ModelsR lm與Python sklearn linear_model

其第一實施例的代碼:

from sklearn import linear_model 
reg = linear_model.LinearRegression() 
reg.fit([[0, 0], [1, 1], [2,2]], [0, 1,2]) 
reg.fit 
reg.coef_ 
array([ 0.5, 0.5]) 

在這裏,我假定[[0, 0], [1, 1], [2,2]]表示含有x1 = c(0,1,2)x2 = c(0,1,2)y = c(0,1,2)以及一個data.frame。

立刻,我開始認爲array([ 0.5, 0.5])x1x2的係數。

但是,這些估計是否存在標準誤差?如何測試p值,R2和其他數字?

然後我嘗試做同樣的事情在R.

X = data.frame(x1 = c(0,1,2),x2 = c(0,1,2),y = c(0,1,2)) 
lm(data=X, y~x1+x2) 
Call: 
lm(formula = y ~ x1 + x2, data = X) 

#Coefficients: 
#(Intercept)   x1   x2 
# 1.282e-16 1.000e+00   NA 

顯然x1x2是完全線性相關,因此OLS將失敗。爲什麼SKlearn仍能正常工作並給出結果?我是否以一種錯誤的方式變得滑稽?謝謝。

+3

也許http://stats.stackexchange.com /問題/ 116825 /異輸出換-R-LM-和蟒-statsmodel醇類換線性迴歸 – hrbrmstr

回答

6

兩種解決方案都是正確的(假設NA表現爲零)。有利於哪種解決方案取決於OLS估算器使用的數值解算器。

sklearn.linear_model.LinearRegression基於scipy.linalg.lstsq進而調用在此所說明的LAPACK gelsd程序:

http://www.netlib.org/lapack/lug/node27.html

特別是它說的是,當問題是秩虧它試圖最小范數最小二乘解。

如果你想有利於其他的解決方案,你可以使用一個座標下降解算器L1罰一點點在次套索類實現:

>>> from sklearn.linear_model import Lasso 
>>> reg = Lasso(alpha=1e-8) 
>>> reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) 

Lasso(alpha=1e-08, copy_X=True, fit_intercept=True, max_iter=1000, 
    normalize=False, positive=False, precompute=False, random_state=None, 
    selection='cyclic', tol=0.0001, warm_start=False) 
>>> reg.coef_ 
array([ 9.99999985e-01, 3.97204719e-17])