2016-10-11 2 views
2

Когда я изучаю Python SKlearn, первым примером, с которым я сталкиваюсь, является Generalized Linear Models.R lm versus 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]] представляет собой data.frame содержащий x1 = c(0,1,2) и x2 = c(0,1,2) и y = c(0,1,2), а также.

Сразу же я начинаю думать, что array([ 0.5, 0.5]) - это коэффициенты для x1 и x2.

Но существуют ли стандартные ошибки для этих оценок? Как насчет t тестов 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 

Очевидно x1 и x2 полностью линейно зависимы, так что МНК потерпит неудачу. Почему SKlearn все еще работает и дает такие результаты? Я получаю 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 казни как это реализованы в го Lasso класса:

>>> 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]) 
Смежные вопросы