Fordel: er at den er hurtig og bruger numpy direkte.
Ulempe: jeg ved ikke hvordan man styrer decimaler i outputtet og den kan ikke lave eksponentiel regression
import numpy as np
import matplotlib.pyplot as plt
x = [0.001,0.002,0.003,0.004]
y = [-3.1,-5.6,-7,-10.9]
coef = np.polyfit(x,y,1)
reg = np.poly1d(coef)
# reg er en funktion som indeholder teksten -ax + b
plt.plot(x,y, 'yo',label=reg)
plt.plot( x, reg(x), '--k')
plt.legend(loc='upper left')
plt.xlim(0, 0.005)
plt.ylim(-12,0)
(x,y,1)her betyder 1-tallet at det er et y=ax+b funktion altså et førstegrads polynomium. Et 2 tal vil give et 2-gradspolynomium y = ax^2 + bx + c osv ..
Fordel: Man definerer selv funktionen. og den kan lave alle mulige former for regression også eksponentiel.
Ulempe: Man skal definere funktionen og den kan faile da fittefunktionen ikke bruger startværdier.
import numpy as np
from scipy.optimize import curve_fit
x = np.array([1, 2, 3, 9])
y = np.array([100, 50, 25, 10])
def fit_func(x, a, b):
return a*x+b #y=ax+b
params = curve_fit(fit_func, x, y)
[a, b] = params[0]
print("hældning a = ", a)
print("skæring b =",b)
*******************************
Output bliver
hældning a = -8.483870871544001
skæring b = 78.06451576829
Læg mærke til def fit_func(x, a, b):
her defineres der en funktion som får navnet
fit_func den har tre input x a b og den "return" 'er y-værdierne. y = a*x+b
For bedre eksponentiel regression brug denne her som bruger startværdier.
Det er på denne her måde man definerer funktionerne:
Fjern # foran den funktion du vil bruge
def fit_func(x, a, b ,c):
#return a*x + b
#return a*x*x + b*x + c
return a*np.exp(-b*x)+c #y=a*e^(-b*x)+c
Print og plot delen skal også modificeres hvis der er flere variabler:
print("a = ",a)
print("b = ",b)
print("c = ",c)
plt.scatter(x,y)
#plt.plot(x,a*x*x+b*x+c)
plt.plot(x,a*np.exp(-b*x)+c)
#plt.plot(x,y,x,a*x+b)
Nedenunder ser du et eksponentielt fit af disse tal:
x = np.array([1, 2, 3, 9])
y = np.array([100, 50, 25, 10])
Print output er :
a = 209.81602897263383
b = 0.8369905170783225
c = 9.414942364469873
Den er specielt effektiv fordi den bruger start værdier og kan dermed fitte næsten alle funktioner.
Her er der en udførlig beskrivelse til eksponentiel fit
Se koden til højre som viser et eksempel fra kemi med øvelsen C-vitamin i juice.
p0=[1, 0] er startværdierne for hældning og skæring som jeg har valgt. Den er rimelig tolerant.
Her et eksempel af REG3 til kemi
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
cvitlist = np.array([25,50,75,100])
diiodlist = np.array([3.1,6.3,9.0,12.2])
def func(x, a, b):
return a * x + b
popt, pcov = curve_fit(func, cvitlist, diiodlist, p0=[1, 0])
plt.plot(cvitlist, func(cvitlist, *popt), 'r-')
plt.scatter(cvitlist,diiodlist)
print('y = {0}*x + {1}'.format(popt[0],popt[1]))
Fordel: Enormt brugt i mange sammenhæng på nettet.
Ulempe: Man skal "reshape" x-array.
Til højre ses en simpel model med numpy. og sklearn modulet.
linje 3 indeholder .reshape((-1,1)) det er nødvendigt for at sætte x-array på højkant.
Resultatet ser ud som følgende:
r-i-anden: 0.715875613747954
b-værdi: 5.633333333333333
hældning: [0.54]
import numpy as np
from sklearn.linear_model import LinearRegression
x = np.array([5, 15, 25, 35, 45, 55]).reshape((-1, 1))
y = np.array([5, 20, 14, 32, 22, 38])
model = LinearRegression()
model.fit(x, y)
r_sq = model.score(x, y)
print('r-i-anden:', r_sq)
print('b-værdi:', model.intercept_)
print('hældning:', model.coef_)