np.polyfit () – Kurvefitting Med NumPy Polyfit
Den .polyfit()
funksjon, aksepterer tre forskjellige inngangsverdier: x
, y
og polynomgraden. Argumenter x
og y
tilsvarer verdiene til datapunktene som vi vil passe, på henholdsvis x
og y
aksene. Den tredje parameteren angir graden av vår polynomfunksjon. For eksempel, for å oppnå en lineær passform, bruk grad 1.
Innholdsfortegnelse
Hva Er Curve Fitting?
Kurvefitting består i å bygge en matematisk funksjon som kan passe til noen spesifikke datapunkter. Mesteparten av tiden er tilpasningsligningen utsatt for begrensninger; dessuten er det også mulig å foreta innledende gjetning for å gi nyttige utgangspunkt for estimering av tilpasningsparametrene, denne sistnevnte prosedyren har fordelen av å senke beregningsarbeidet. I denne artikkelen vil vi utforske numpy-funksjonen .polyfit()
, som gjør det mulig å lage polynom fit-funksjoner på en veldig enkel og umiddelbar måte.
Lineær passform
den enkleste typen passform er lineær passform (en første-graders polynomfunksjon), der datapunktene er montert ved hjelp av en rett linje. Den generelle ligningen for en rett linje er:
y = mx + q
hvor » m «kalles vinkelkoeffisient og» q » avskjæring. Når vi bruker en lineær passform, søker vi i utgangspunktet verdiene for parametrene » m » og » q » som gir best passform for våre datapunkter. I Numpy er funksjonen np.polyfit()
et veldig intuitivt og kraftig verktøy for montering av datapunkter; la oss se hvordan du passer til en tilfeldig serie datapunkter med en rett linje.
i følgende eksempel vil vi bruke en lineær tilpasning til noen datapunkter, beskrevet av arrays x
og y
. Den .polyfit()
funksjon, aksepterer tre forskjellige inngangsverdier: x
, y
og polynomgraden. Mens x
og y
tilsvarer verdiene til datapunktene som vi vil passe, på henholdsvis x
og y
aksene; den tredje parameteren angir graden av vår polynomfunksjon. Siden vi ønsker en lineær passform, vil vi spesifisere en grad lik 1. Utgangene til funksjonen polyfit()
vil være en liste som inneholder tilpasningsparametrene; den første er den som i funksjonen multipliseres med høyeste grad sikt; de andre følger deretter denne rekkefølgen.
import numpy as npfrom numpy import random #it will be useful for generating some random noise (on purpose) in the data points that we want to fitimport matplotlib.pyplot as plt #for plotting the data#---LINEAR FIT----#generate the x arrayx = np.linspace(0,60,60) # generate an array of 60 equally space points#generate the y array exploiting the random.randint() function to introduce some random noisey = np.array() #each element is a random number with value between +-2 the respective x axis value#Applying a linear fit with .polyfit()fit = np.polyfit(x,y,1)ang_coeff = fitintercept = fitfit_eq = ang_coeff*x + intercept #obtaining the y axis values for the fitting function#Plotting the datafig = plt.figure()ax = fig.subplots()ax.plot(x, fit_eq,color = 'r', alpha = 0.5, label = 'Linear fit')ax.scatter(x,y,s = 5, color = 'b', label = 'Data points') #Original data pointsax.set_title('Linear fit example')ax.legend()plt.show()
som nevnt tidligere vil variabelen fit
inneholde tilpasningsparametrene. Den første er vinkelkoeffisienten, den siste er avskjæringen. På dette punktet, for å plotte vår passform, må vi bygge y-akseverdiene fra de oppnådde parametrene, ved hjelp av de opprinnelige x-akseverdiene. I eksemplet er dette trinnet beskrevet ved definisjonen av fit_eq
variabelen. Den siste gjenværende tingen er å plotte dataene og den passende ligningen. Resultatet er:
Polynomisk passform av andre grad
i dette andre eksemplet vil vi lage en andregrads polynomisk passform. Polynomfunksjonene av denne typen beskriver en parabolisk kurve i xy-planet; deres generelle ligning er:
y = ax2 + bx + c
hvor a, b og c er likningsparametrene som vi anslår når vi genererer en passende funksjon. Datapunktene som vi passer inn i dette eksemplet, representerer banen til et objekt som er kastet fra en ukjent høyde. Ved å utnytte funksjonen .polyfit()
vil vi passe til banen til det fallende objektet, og vi vil også få et estimat for sin innledende hastighet i x-retningen, v0.
#-----POLYNOMIAL FIT----x = np.array() # x coordinatesy = np.array() # y coordinatesfit = np.polyfit(x, y, 2)a = fitb = fitc = fitfit_equation = a * np.square(x) + b * x + c#Plottingfig1 = plt.figure()ax1 = fig1.subplots()ax1.plot(x, fit_equation,color = 'r',alpha = 0.5, label = 'Polynomial fit')ax1.scatter(x, y, s = 5, color = 'b', label = 'Data points')ax1.set_title('Polynomial fit example')ax1.legend()plt.show()
når initialisert x
og y
arrays definere objektbanen, bruker vi funksjonen .polyfit()
, denne gangen setter «2» som grad av polynom fit-funksjonen. Dette skyldes at banen til en fallende gjenstand kan beskrives ved et andregrads polynom; i vårt tilfelle er forholdet mellom koordinatene x
og y
gitt av:
y = y0 – ½ (g/ v02)x2
hvor y0 er startposisjonen (høyden som objektet er kastet fra), g akselerasjonen av tyngdekraften (9,81 m / s2) og v0 starthastigheten (m / s) i x-retningen (besøk: https://en.wikipedia.org/wiki/Equations_for_a_falling_body for mer informasjon). Vi tilordner deretter ved variablene a
, b
og c
verdien av de 3 tilpasningsparametrene, og vi definerer fit_equation
, polynomligningen som vil bli plottet; resultatet er:
hvis vi nå skriver ut de tre monteringsparametrene, a, b og c, får vi følgende verdier: a = -0,100, b = 0,038, c = 24,92. I ligningen som beskriver banen til en fallende kropp er det ingen b-term; siden passformen alltid er en tilnærming til det virkelige resultatet, vil vi alltid få en verdi for alle parametrene; men vi skal legge merke til at verdien av vår b-term er mye mindre enn de andre og kan på en eller annen måte forsømmes når vi sammenligner vår passform med ligningen som beskriver problemets fysikk. C-termen representerer starthøyden (y0) mens a-termen beskriver mengden – ½ (g/ v02). Derfor er den innledende hastigheten v0 gitt av:
v0=2-g2a
Som Gir den endelige verdien av v0 = 6.979 m / s.