Ich verwende Python und Numpy, um ein Best-Fit-Polynom beliebigen Grades zu berechnen. Ich übergebe eine Liste mit x-Werten, y-Werten und dem Grad des Polynoms, das ich anpassen möchte (linear, quadratisch usw.).
So viel funktioniert, aber ich möchte auch r (Korrelationskoeffizient) und r-Quadrat (Bestimmungskoeffizient) berechnen. Ich vergleiche meine Ergebnisse mit der am besten passenden Trendlinienfunktion von Excel und dem berechneten R-Quadrat-Wert. Auf diese Weise weiß ich, dass ich das r-Quadrat für die lineare Bestanpassung korrekt berechne (Grad gleich 1). Meine Funktion funktioniert jedoch nicht für Polynome mit einem Grad größer als 1.
Excel ist dazu in der Lage. Wie berechne ich das r-Quadrat für Polynome höherer Ordnung mit Numpy?
Hier ist meine Funktion:
import numpy
# Polynomial Regression
def polyfit(x, y, degree):
results = {}
coeffs = numpy.polyfit(x, y, degree)
# Polynomial Coefficients
results['polynomial'] = coeffs.tolist()
correlation = numpy.corrcoef(x, y)[0,1]
# r
results['correlation'] = correlation
# r-squared
results['determination'] = correlation**2
return results
quelle
Antworten:
In der Dokumentation zu numpy.polyfit wird die lineare Regression angepasst. Insbesondere passt numpy.polyfit mit dem Grad 'd' eine lineare Regression mit der mittleren Funktion an
E (y | x) = p_d * x ** d + p_ {d-1} * x ** (d-1) + ... + p_1 * x + p_0
Sie müssen also nur das R-Quadrat für diese Anpassung berechnen. Die Wikipedia-Seite zur linearen Regression enthält alle Details. Sie interessieren sich für R ^ 2, das Sie auf verschiedene Arten berechnen können, wobei es wahrscheinlich am einfachsten ist
Wobei ich 'y_bar' als Mittelwert der ys und 'y_ihat' als Anpassungswert für jeden Punkt verwende.
Ich bin mit Numpy nicht besonders vertraut (ich arbeite normalerweise in R), daher gibt es wahrscheinlich eine übersichtlichere Methode, um Ihr R-Quadrat zu berechnen, aber das Folgende sollte korrekt sein
quelle
R^2 = 1 - SS_err/SS_tot
, mitR^2 = SS_reg/SS_tot
nur ein Sonderfall zu sein.Eine sehr späte Antwort, aber nur für den Fall, dass jemand eine fertige Funktion dafür benötigt:
scipy.stats.linregress
dh
wie in der Antwort von @Adam Marples.
quelle
From yanl (noch eine andere Bibliothek)
sklearn.metrics
hat einer2_score
Funktion;quelle
Ich habe dies erfolgreich verwendet, wobei x und y Array-ähnlich sind.
quelle
Ich habe ursprünglich die folgenden Benchmarks mit dem Ziel veröffentlicht, zu empfehlen
numpy.corrcoef
, dummerweise nicht zu erkennen, dass die ursprüngliche Frage bereits verwendet wirdcorrcoef
und tatsächlich nach Polynomanpassungen höherer Ordnung gefragt hat. Ich habe eine tatsächliche Lösung für die Polynom-R-Quadrat-Frage mithilfe von Statistikmodellen hinzugefügt und die ursprünglichen Benchmarks beibehalten, die zwar nicht zum Thema gehören, aber möglicherweise für jemanden nützlich sind.statsmodels
hat die Fähigkeit, dier^2
Polynomanpassung direkt zu berechnen , hier sind 2 Methoden ...Um dies weiter zu nutzen
statsmodels
, sollte man sich auch die angepasste Modellzusammenfassung ansehen, die in Jupyter / IPython-Notizbuch gedruckt oder als umfangreiche HTML-Tabelle angezeigt werden kann. Das Ergebnisobjekt bietet zusätzlich Zugriff auf viele nützliche statistische Metrikenrsquared
.Unten ist meine ursprüngliche Antwort, in der ich verschiedene lineare Regressionsmethoden verglichen habe ...
Die in der Frage verwendete Corrcoef- Funktion berechnet den Korrelationskoeffizienten
r
nur für eine einzelne lineare Regression, sodass die Frager^2
nach Polynomanpassungen höherer Ordnung nicht behandelt wird . Für das, was es wert ist, habe ich jedoch festgestellt, dass es für die lineare Regression tatsächlich die schnellste und direkteste Berechnungsmethode istr
.Dies waren meine zeitlichen Ergebnisse aus dem Vergleich einer Reihe von Methoden für 1000 zufällige (x, y) Punkte:
r
Berechnung)r
Berechnung)r
Berechnung)r
als Ausgabe)Die Corrcoef-Methode schlägt die Berechnung des r ^ 2 "manuell" mit Numpy-Methoden knapp. Es ist> 5X schneller als die Polyfit-Methode und ~ 12X schneller als die scipy.linregress. Nur um zu verstärken, was Numpy für Sie tut, ist es 28-mal schneller als reines Python. Ich bin mit Dingen wie Numba und Pypy nicht vertraut, daher müsste jemand anderes diese Lücken füllen, aber ich denke, das überzeugt mich sehr, dass dies
corrcoef
das beste Werkzeug für die Berechnungr
einer einfachen linearen Regression ist.Hier ist mein Benchmarking-Code. Ich habe von einem Jupyter-Notizbuch kopiert (es ist schwer, es nicht als IPython-Notizbuch zu bezeichnen ...), also entschuldige ich mich, wenn unterwegs etwas kaputt gegangen ist. Der Befehl% timeit magic erfordert IPython.
quelle
statsmodels
und mich für das unnötige Benchmarking der linearen Regressionsmethoden entschuldigt, das ich als interessante, aber nicht themenbezogene Informationen beibehalten habe.np.column_stack([x**i for i in range(k+1)])
Kann mitx[:,None]**np.arange(k+1)
oder unter Verwendung der Vander-Funktionen von Numpy in umgekehrter Reihenfolge in Spalten vektorisiert werden .Das R-Quadrat ist eine Statistik, die nur für die lineare Regression gilt.
Im Wesentlichen wird gemessen, wie stark die Variation Ihrer Daten durch die lineare Regression erklärt werden kann.
Sie berechnen also die "Gesamtsumme der Quadrate", die die gesamte quadratische Abweichung jeder Ihrer Ergebnisvariablen von ihrem Mittelwert darstellt. . .
\ sum_ {i} (y_ {i} - y_bar) ^ 2
Dabei ist y_bar der Mittelwert der ys.
Dann berechnen Sie die "Regressionssumme der Quadrate", dh wie stark sich Ihre FITTED-Werte vom Mittelwert unterscheiden
\ sum_ {i} (yHat_ {i} - y_bar) ^ 2
und finde das Verhältnis dieser beiden.
Alles, was Sie für eine Polynomanpassung tun müssten, ist das Einstecken des y_hat aus diesem Modell, aber es ist nicht genau, dieses r-Quadrat zu nennen.
Hier ist ein Link, den ich gefunden habe und der ein wenig dazu spricht.
quelle
Der Wikipedia-Artikel über R-Quadrate schlägt vor, dass er eher für die allgemeine Modellanpassung als nur für die lineare Regression verwendet werden kann.
quelle
Hier ist eine Funktion zum Berechnen des gewichteten R-Quadrats mit Python und Numpy (der größte Teil des Codes stammt von sklearn):
Beispiel:
Ausgänge:
Dies entspricht der Formel ( Spiegel ):
mit f_i ist der vorhergesagte Wert aus der Anpassung, y_ {av} ist der Mittelwert der beobachteten Daten y_i ist der beobachtete Datenwert. w_i ist die Gewichtung, die auf jeden Datenpunkt angewendet wird, normalerweise w_i = 1. SSE ist die Summe der fehlerhaften Quadrate und SST ist die Gesamtsumme der Quadrate.
Bei Interesse den Code in R: https://gist.github.com/dhimmel/588d64a73fa4fef02c8f ( Spiegel )
quelle
Hier ist eine sehr einfache Python-Funktion zum Berechnen von R ^ 2 aus den tatsächlichen und vorhergesagten Werten unter der Annahme, dass y und y_pandas-Reihen sind:
quelle
Aus der Quelle scipy.stats.linregress. Sie verwenden die Methode der durchschnittlichen Quadratsumme.
quelle
Sie können diesen Code direkt ausführen. Hier finden Sie das Polynom und den R-Wert. Wenn Sie weitere Erläuterungen benötigen, können Sie unten einen Kommentar abgeben.
quelle