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

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert