2016-04-27 1 views
2

I linear bin regredieren k Antwortvariablen y auf auf k x n Prädiktorvariablen X, wobei k> = n. Mit Scikit-Learn scheint die Regression korrekt zu sein, außer wenn n = k; d.h. wenn die Matrix der Prädiktoren quadratisch ist. Betrachten Sie die folgende MWE, wobei I die zufällig Matrix X und Koeffizienten b erzeugen, um die y zu konstruieren, dann führen Regression Scikit-Learn zu überprüfen, daß die Koeffizienten die gleichen sind wie die echten Koeffizienten sind:Scikit-Learn Lineare Regression auf quadratische Matrix scheint falsch

import numpy as np 
from sklearn import linear_model 


n = 5 # number of predictor variables         
k = 5 # number of response variables, >= n *** Set = n for issue *** 
mu_b = 2.0 # mean of each component of b, used to create coeffs   

print "n = ", n 

# generate true coefficients ~ N(2,0.09)         
b = np.random.normal(2.0, 0.3, n) 

print "b = ", b 

# generate true predictors ~ N(0,25)          
X = np.random.normal(0.0, 5.0, (k,n)) 

# generate true target variables           
y = X.dot(b) 


# create linear regression object          
regr = linear_model.LinearRegression() 

# train model               
regr.fit(X,y) 

# print coeffs               
print "estimated b = ", regr.coef_ 

# print difference              
print "difference = ", np.linalg.norm(b - regr.coef_) 

Wenn k> Es gibt keinen Unterschied in der Maschinengenauigkeit, aber wenn k = n ist, kann es einen großen Unterschied geben. Hat jemand anderes das angetroffen? Ist das ein bekannter Fehler?

+0

Ich denke, Sie bekommen Ihre Konzepte verwechselt, in Ihrem Code sieht es aus wie 'k' ist die Anzahl der Prädiktorvariablen, und 'n' ist die Stichprobengröße; und Sie müssen 'n' strikt größer als' k' haben, damit die Regression sinnvoll ist. Denken Sie darüber nach, stellen Sie sich 'k = 1' vor, so dass Sie nur eine Variable haben, die Sie vorherzusagen versuchen, d. H. Sie versuchen, den Gradienten einer Linie zu berechnen. Du brauchst mindestens zwei Punkte, um dies zu erklären, also musst du 'n> 2' haben. – maxymoo

+0

@maxymoo nein, der Code ist korrekt. Es funktioniert, wenn ich das System lstsq aus np.linalg für eine quadratische Matrix und für k> = n mit scikit-learn lösen. Ich glaube, es gibt einen Bug in scikit-learn. – bcf

Antwort

1

Standardmäßig ist das Attribut fit_intercept der Klasse LinearRegression auf True eingestellt. Dies scheint zwei Effekte zu haben. Zuerst, bevor das Modell unter Verwendung von linalg.lstsq angepasst wird, werden die Matrizen X und y durch Subtrahieren des Mittelwerts in der _center_data-Methode zentriert. Zweitens nach dem Modell wird die _set_intercept Sätze:

regr.intercept_ = y_mean - np.dot(X_mean, regr.coef_.T) 

Es ist nicht klar, aus der Dokumentation, wie dieser Begriff Intercept abgeleitet wird.

In Ihrem Fall können Sie, dass in den Fällen, in denen inspizieren k > n der resultierende intercept_ Begriff in der Größenordnung von 1e-14 ist, aber für k = n, intercept_ nicht Null ist, zu erklären, warum Koeffizientenvektor Mismatch im Fall von k = n. Sie können dies beheben, indem Sie einfach fit_intercept=False in Ihrem Modell einstellen.

Caveat: eine sinnvolle Antwort, natürlich, könnte erklären, wie der Schnittpunkt Begriff stammt, sowie einen Einblick, warum das Intercept-Term ist Null für k > n.