Es gab bestimmte abfallende Zeitreihendaten, und als ich versuchte, mit EXCEL eine Näherungskurve zu zeichnen, war die Leistungsnäherung ein gutes Gefühl, weshalb ich mich aus geschäftlichen Gründen entschied, sie mit Python anstelle von EXCEL zu reproduzieren. Als Ergebnis des Versuchs passt es aus irgendeinem Grund nicht ... Als ich mich fragte warum, kam ich zu den folgenden Informationen. Approximation mit Python multiplizieren Die meisten Probleme können durch einen Blick auf diese Website gelöst werden, aber ich werde einen Artikel für mein Memorandum schreiben.
Der Potenzausdruck ist wie folgt definiert.
Was ist also mit EXCEL?
Die obige Gleichung kann wie folgt umgewandelt werden.
Mal sehen, was eigentlich mit Python passiert. Für die Daten werden wir die Daten zu Änderungen der Zahl der Todesfälle und Sterblichkeitsraten von Säuglingen im "Weißbuch 2011 über Kinder und Jugendliche" auf der Seite des Kabinetts verwenden. "Weißbuch 2011 über Kinder und Jugendliche" Änderungen in der Anzahl der Todesfälle und Sterblichkeitsraten von Säuglingen
read_data.py
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import pandas as pd
df=pd.read_csv('Säuglingssterblichkeit.csv',encoding='cp932') #Codierung mit verstümmelter Prävention='cp932'
display(df)
adjust_data.py
df=df.iloc[3:18,:].rename(columns={'1-1-Abbildung 6 Veränderungen in der Anzahl der Todesfälle und Sterblichkeitsraten von Säuglingen':'Jährlich'\
,'Unnamed: 1':'Säuglingstod (Menschen)'\
,'Unnamed: 2':'Säuglingstod (Tausende)'\
,'Unnamed: 3':'Säuglingssterblichkeit'})
#Erstellen Sie Seriennummernspalten für die spätere Verarbeitung
rank=range(1,len(df)+1)
df['rank']=rank
#Die Kindersterblichkeitsrate ist vom Float-Typ, da alle Spalten vom Objekttyp sind
df['Säuglingssterblichkeit']=df['Säuglingssterblichkeit'].astype(float)
df['Säuglingstod (Menschen)']=df['Säuglingstod (Menschen)'].str.replace(',','').astype(np.int)
display(df)
plot.py
x=df['Jährlich']
y=df['Säuglingssterblichkeit']
ax=plt.subplot(1,1,1)
ax.plot(x,y)
ax.set_xlabel('Jährlich')
ax.set_ylabel('Säuglingssterblichkeit')
plt.show()
Die Kindersterblichkeit ist viel niedriger als vor 60 Jahren. Der Fortschritt der medizinischen Versorgung ist erstaunlich. Jetzt ist es Zeit, die ungefähren Parameter zu finden.
func.py
def exp_func(x, a, b):
return b*(x**a)
def exp_fit(val1_quan, val2_quan):
#maxfev: maximale Anzahl von Funktionsaufrufen, check_endlich: Wenn True, tritt ValueError auf, wenn NaN enthalten ist.
l_popt, l_pcov = curve_fit(exp_func, val1_quan, val2_quan, maxfev=10000, check_finite=False)
return exp_func(val1_quan, *l_popt),l_popt
Finden Sie die Parameter $ a $ und $ b $ von exp_func mit exp_fit.
culc_params.py
x=df['Jährlich']
x2=df['rank']
y=df['Säuglingssterblichkeit']
y_fit,l_popt=exp_fit(x2,y)
ax=plt.subplot(1,1,1)
ax.plot(x,y,label='obs')
ax.plot(x,y_fit,label='model')
ax.set_xlabel('Jährlich')
ax.set_ylabel('Säuglingssterblichkeit')
plt.legend()
plt.show()
print('a : {}, b : {}'.format(l_popt[0],l_popt[1]))#Erhaltener Parameter a,Überprüfen Sie b
Gutes Gefühl.
func2.py
def exp_func_log(x, a, b):
return a*np.log(x) + np.log(b)
def exp_func_log_fit(val1_quan, val2_quan):
l_popt, l_pcov = curve_fit(exp_func_log, val1_quan, np.log(val2_quan), maxfev=10000, check_finite=False)
return exp_func_log(val1_quan, *l_popt),l_popt
def log_to_exp(x,a,b):
return np.exp(a*np.log(x) + np.log(b))
Suchen Sie die Parameter $ a $ und $ b $ von exp_func_log mit exp_func_log_fit. Da $ Y $ unter Verwendung der erhaltenen Parameter $ a $ und $ b $ $ \ ln y $ approximiert wird, wird log_to_exp verwendet, um es vom logarithmischen Wert zurück zu konvertieren.
culc_params2.py
x=df['Jährlich']
x2=df['rank']
y=df['Säuglingssterblichkeit']
y_fit,l_popt=exp_func_log_fit(x2,y)
y_fit=log_to_exp(x2,l_popt[0],l_popt[1])
ax=plt.subplot(1,1,1)
ax.plot(x,y,label='obs')
ax.plot(x,y_fit,label='model')
ax.set_xlabel('Jährlich')
ax.set_ylabel('Säuglingssterblichkeit')
plt.legend()
plt.show()
print('a : {}, b : {}'.format(l_popt[0],l_popt[1])) #Erhaltener Parameter a,Überprüfen Sie b
Es fühlt sich gut an, aber ich denke, dass die direkte nichtlineare Regression besser anwendbar war.
Ich bin mir nicht sicher, welches für mich das richtige ist. Wenn Sie jedoch in eine Situation geraten, in der "EXCEL dies kann, Python jedoch nicht dasselbe!", Sollten Sie sich daran erinnern.
Wenn der numerische Wert der Daten groß und verschwommen ist, kann die Approximation durch nichtlineare Regression leicht durch die große Fluktuation des numerischen Werts gezogen werden. Unter dem Gesichtspunkt der Generalisierungsfähigkeit kann es besser sein, eine logarithmische Transformation und eine lineare Regression durchzuführen.
dummydata.py
df=pd.read_csv('Säuglingssterblichkeit.csv',encoding='cp932')
df=df.iloc[3:18,:].rename(columns={'1-1-Abbildung 6 Veränderungen in der Anzahl der Todesfälle und Sterblichkeitsraten von Säuglingen':'Jährlich'\
,'Unnamed: 1':'Säuglingstod (Menschen)'\
,'Unnamed: 2':'Säuglingstod (Tausende)'\
,'Unnamed: 3':'Säuglingssterblichkeit'})
#Erstellen Sie Seriennummernspalten für die spätere Verarbeitung
rank=range(1,len(df)+1)
df['rank']=rank
#Die Kindersterblichkeitsrate ist vom Float-Typ, da alle Spalten vom Objekttyp sind
df['Säuglingssterblichkeit']=df['Säuglingssterblichkeit'].astype(float)
df['Säuglingstod (Menschen)']=df['Säuglingstod (Menschen)'].str.replace(',','').astype(np.int)
#Dummy-Daten einfügen
df2=df.copy()
df2.loc[df2['Jährlich']=='Heisei 2', 'Säuglingstod (Menschen)']=60000
df2.loc[df2['Jährlich']=='13', 'Säuglingstod (Menschen)']=40000
df2.loc[df2['Jährlich']=='15', 'Säuglingstod (Menschen)']=20000
df2.loc[df2['Jährlich']=='18', 'Säuglingstod (Menschen)']=10000
display(df2)
x=df2['Jährlich']
y=df2['Säuglingstod (Menschen)']
ax=plt.subplot(1,1,1)
ax.plot(x,y)
ax.set_xlabel('Jährlich')
ax.set_ylabel('Säuglingstod (Menschen)')
ax.set_title('Dummy-Nummern im Jahr 1990,13,15,Einfügen in 18')
plt.show()
dummydata.py
#Nichtlineare Regression
x=df2['Jährlich']
x2=df2['rank']
y=df2['Säuglingstod (Menschen)']
y_fit,l_popt=exp_fit(x2,y)
ax=plt.subplot(1,1,1)
ax.plot(x,y,label='obs')
ax.plot(x,y_fit,label='model')
ax.set_xlabel('Jährlich')
ax.set_ylabel('Säuglingstod (Menschen)')
plt.legend()
plt.show()
print('a : {}, b : {}'.format(l_popt[0],l_popt[1]))
#Logistische Transformation lineare Regression
x=df2['Jährlich']
x2=df2['rank']
y=df2['Säuglingstod (Menschen)']
y_fit,l_popt=exp_func_log_fit(x2,y)
y_fit=log_to_exp(x2,l_popt[0],l_popt[1])
ax=plt.subplot(1,1,1)
ax.plot(x,y,label='obs')
ax.plot(x,y_fit,label='model')
ax.set_xlabel('Jährlich')
ax.set_ylabel('Säuglingstod (Menschen)')
plt.legend()
plt.show()
print('a : {}, b : {}'.format(l_popt[0],l_popt[1]))
Ungefähr mit nichtlinearer Regression Ungefähre logarithmische Transformation lineare Regression
Offensichtlich wird derjenige, der durch nichtlineare Regression angenähert wird, durch die Fluktuation des in den Dummy eingegebenen numerischen Werts gezogen. Es scheint wichtig, je nach Situation richtig zu unterscheiden und zu verwenden.
Recommended Posts