Curve-aanpassing in python (met voorbeelden)
Vaak wil je misschien een curve aan een dataset in Python aanpassen.
In het volgende stapsgewijze voorbeeld wordt uitgelegd hoe u curven aan gegevens in Python kunt aanpassen met behulp van de functie numpy.polyfit() en hoe u kunt bepalen welke curve het beste bij de gegevens past.
Stap 1: Gegevens creëren en visualiseren
Laten we beginnen met het maken van een nepgegevensset en vervolgens een spreidingsdiagram maken om de gegevens te visualiseren:
import pandas as pd import matplotlib. pyplot as plt #createDataFrame df = pd. DataFrame ({' x ': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], ' y ': [3, 14, 23, 25, 23, 15, 9, 5, 9, 13, 17, 24, 32, 36, 46]}) #create scatterplot of x vs. y plt. scatter (df. x , df. y )
Stap 2: Pas meerdere curven aan
Laten we vervolgens verschillende polynomiale regressiemodellen aan de gegevens aanpassen en de curve van elk model in dezelfde plot visualiseren:
import numpy as np
#fit polynomial models up to degree 5
model1 = np. poly1d (np. polyfit (df. x , df. y , 1))
model2 = np. poly1d (np. polyfit (df. x , df. y , 2))
model3 = np. poly1d (np. polyfit (df. x , df. y , 3))
model4 = np. poly1d (np. polyfit (df. x , df. y , 4))
model5 = np. poly1d (np. polyfit (df. x , df. y , 5))
#create scatterplot
polyline = np. linspace (1, 15, 50)
plt. scatter (df. x , df. y )
#add fitted polynomial lines to scatterplot
plt. plot (polyline, model1(polyline), color=' green ')
plt. plot (polyline, model2(polyline), color=' red ')
plt. plot (polyline, model3(polyline), color=' purple ')
plt. plot (polyline, model4(polyline), color=' blue ')
plt. plot (polyline, model5(polyline), color=' orange ')
plt. show ()
Om te bepalen welke curve het beste bij de gegevens past, kunnen we naar het aangepaste R-kwadraat van elk model kijken.
Deze waarde vertelt ons het percentage variatie in de responsvariabele dat kan worden verklaard door de voorspellende variabele(n) in het model, aangepast voor het aantal voorspellende variabelen.
#define function to calculate adjusted r-squared def adjR(x, y, degree): results = {} coeffs = np. polyfit (x, y, degree) p = np. poly1d (coeffs) yhat = p(x) ybar = np. sum (y)/len(y) ssreg = np. sum ((yhat-ybar)**2) sstot = np. sum ((y - ybar)**2) results[' r_squared '] = 1- (((1-(ssreg/sstot))*(len(y)-1))/(len(y)-degree-1)) return results #calculated adjusted R-squared of each model adjR(df. x , df. y , 1) adjR(df. x , df. y , 2) adjR(df. x , df. y , 3) adjR(df. x , df. y , 4) adjR(df. x , df. y , 5) {'r_squared': 0.3144819} {'r_squared': 0.5186706} {'r_squared': 0.7842864} {'r_squared': 0.9590276} {'r_squared': 0.9549709}
Uit het resultaat kunnen we zien dat het model met de hoogst aangepaste R-kwadraat de vierdegraads polynoom is, die een aangepaste R-kwadraat van 0,959 heeft.
Stap 3: Visualiseer de uiteindelijke curve
Ten slotte kunnen we een spreidingsdiagram maken met de curve van het vierdegraads polynoommodel:
#fit fourth-degree polynomial model4 = np. poly1d (np. polyfit (df. x , df. y , 4)) #define scatterplot polyline = np. linspace (1, 15, 50) plt. scatter (df. x , df. y ) #add fitted polynomial curve to scatterplot plt. plot (polyline, model4(polyline), ' -- ', color=' red ') plt. show ()
We kunnen ook de vergelijking voor deze regel verkrijgen met behulp van de print() functie:
print (model4)
4 3 2
-0.01924x + 0.7081x - 8.365x + 35.82x - 26.52
De vergelijking van de curve is als volgt:
y = -0,01924x 4 + 0,7081x 3 – 8,365x 2 + 35,82x – 26,52
We kunnen deze vergelijking gebruiken om de waarde van deresponsvariabele te voorspellen op basis van de voorspellende variabelen in het model. Als x = 4 bijvoorbeeld, voorspellen we dat y = 23,32 :
y = -0,0192(4) 4 + 0,7081(4) 3 – 8,365(4) 2 + 35,82(4) – 26,52 = 23,32
Aanvullende bronnen
Een inleiding tot polynomiale regressie
Hoe polynomiale regressie uit te voeren in Python