Geschichte der Potenznäherung von Python

Die Geschichte beginnt mit dem Zeichnen einer Potenznäherungskurve mit EXCEL

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.

Unterschied zwischen der Leistungsnäherung durch curve_fit von scipy und der Leistungsnäherung von EXCEL

Der Potenzausdruck ist wie folgt definiert.   y = bx^{a} Die Kurve_Fit von scipy führt eine nichtlineare Regression durch, die $ a $ und $ b $ zurückgibt, die den Daten in der obigen Gleichung am ähnlichsten sind.

Was ist also mit EXCEL? Die obige Gleichung kann wie folgt umgewandelt werden.   y = bx^{a} $ \ Rightarrow \ ln y = \ ln (bx ^ {a}) ・ ・ ・ (nimm einen Logarithmus) $ $ \ Rightarrow \ ln y = a \ ln x + \ ln b ・ ・ ・ (zerlege die rechte Seite) $ $ \ Rightarrow Y = aX + B ・ ・ ・ (fasse den logarithmischen Teil als neue Variable zusammen) $ Indem der logarithmische Logarithmus auf diese Weise genommen wird, kann eine lineare Regression von $ Y = aX + B $ durchgeführt werden. Mit anderen Worten, es scheint, dass die Leistungsnäherung von EXCEL das Ergebnis der ** logarithmischen Umwandlung und der linearen Regression ** ausgibt.

Versuchen Sie es mit Python

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

Lesen Sie zuerst die Daten

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)

image.png

Geformt, weil es eine seltsame Struktur hat

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)

image.png

Säuglingssterblichkeitsplot

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()

image.png 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.

Nichtlineare Regression mit Curve_fit von Scipy

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

image.png

Gutes Gefühl.

Reproduktion der EXCEL-Potenznäherung (logarielle Umwandlung und lineare Regression)

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

image.png Es fühlt sich gut an, aber ich denke, dass die direkte nichtlineare Regression besser anwendbar war.

Zusammenfassung

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.

Nachtrag (unmittelbar nach dem Schreiben am 28.02.2020)

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.

Fügen Sie eine Dummy-Nummer in die Anzahl der Todesfälle bei Säuglingen (Personen) ein.

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()

image.png image.png

Zeichnen Sie erneut eine ungefähre Kurve mit der in diesem Band verwendeten Funktion

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 image.png Ungefähre logarithmische Transformation lineare Regression image.png

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

Geschichte der Potenznäherung von Python
Die Kraft der Pandas: Python
Die Geschichte von Python und die Geschichte von NaN
Erweiterung des Python-Wörterbuchs um Argumente
Verhalten von Python3 durch Sakuras Server
Untersuchung der von Python steuerbaren Gleichstromversorgung
Erklärung des Produktionsoptimierungsmodells durch Python
Schritt-für-Schritt-Approximation von Bildern mit niedrigem Rang durch HOSVD
Niedrigrangige Approximation des Bildes durch Tucker-Zerlegung
[Lernnotiz] Grundlagen des Unterrichts mit Python
Bedingte Verzweigung von Python mit Chemoinfomatik gelernt
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Die Geschichte der Manipulation globaler Python-Variablen
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Analyse des Röntgenmikrotomographiebildes durch Python
Die Geschichte der Verarbeitung A von Blackjack (Python)
Python-Grundlagen ①
Grundlagen von Python ①
Kopie von Python
Einführung von Python
Niedrigrangige Approximation von Bildern durch Singularitätszerlegung
Niedrigrangige Approximation von Bildern durch HOSVD und HOOI
Bildverarbeitung? Die Geschichte, Python für zu starten
Die Geschichte des Lesens von HSPICE-Daten in Python
Führen Sie Power Query aus, indem Sie Argumente an Python übergeben
Grundlegende Geschichte der Vererbung in Python (für Anfänger)
Primzahlbeurteilung durch Python
[Python] Operation der Aufzählung
Liste der Python-Module
[Sprachverarbeitung 100 Schläge 2020] Zusammenfassung der Antwortbeispiele von Python
Bildverarbeitung durch Matrix Basics & Contents-Reinventor der Python-Bildverarbeitung-
Die Geschichte von Python ohne Inkrement- und Dekrementoperatoren.
Visualisierungsnotiz von Python
Kommunikationsverarbeitung durch Python
Vereinheitlichung der Python-Umgebung
Kopie der Python-Einstellungen
Die Geschichte der durch gcrypto20 verursachten Nichtübereinstimmung von Hash Sum
Zusammenfassung der Python-Artikel des Pharmaunternehmens Yukiya
Grundlagen der Python-Scraping-Grundlagen
[Python] Verhalten von Argmax
Python kleine Geschichte Sammlung
Verwendung von Python-Einheimischen ()
der Zen von Python
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Installieren von Python 3.3 rc1
Die Geschichte von sys.path.append ()
# 4 [Python] Grundlagen der Funktionen
Beamformer-Antwort von Python
Grundkenntnisse in Python
Nüchterne Trivia von Python3
Zusammenfassung der Python-Argumente
Gruppieren Sie nach aufeinanderfolgenden Elementen einer Liste in Python
Grundlagen von Python: Ausgabe
Die Geschichte der automatischen Sprachkonvertierung von TypeScript / JavaScript / Python
Installation von matplotlib (Python 3.3.2)
Anwendung von Python 3 vars
Memo von "Cython beschleunigt Python durch Fusion mit C"
Verschiedene Verarbeitung von Python