[PYTHON] Als ich versuchte, über logistische Regression zu schreiben, fand ich schließlich den Mittelwert und die Varianz der logistischen Verteilung.

Bei der Arbeit verwende ich häufig die logistische Regression, aber es fällt mir oft schwer, zu den gewünschten Informationen zu gelangen, wenn ich ein wenig Bedenken habe. Daher möchte ich die logistische Regression als mein eigenes Memo zusammenfassen.

Logistische Regression scheint im medizinischen Bereich häufig eingesetzt zu werden. Natürlich wird es aufgrund seiner hohen Interpretierbarkeit, Einfachheit des Modells und hohen Genauigkeit häufig in anderen Bereichen eingesetzt.

Betrachten Sie nun das Problem der Vorhersage, ob der Eingabevektor $ x $ den beiden Klassen $ C_0 oder C_1 $ zugeordnet wird.

Sei $ y ∈ \ {0,1 \} $ die Zielvariable (Ausgabe) und $ x ∈ R ^ d $ die erklärende Variable (Eingabe). Hier ist $ y = 0 $, wenn es $ C_0 $ zugewiesen ist, und $ y = 1 $, wenn es $ C_1 $ zugewiesen ist.


## Lineare Diskriminierung Ich habe 20 künstlich erzeugte Daten vorbereitet (ich habe es gerade richtig gemacht). Dieses Mal werde ich Python verwenden.

python


import matplotlib.pyplot as plt

x = [1.3, 2.5, 3.1, 4, 5.8, 6, 7.5, 8.4, 9.9, 10, 11.1, 12.2, 13.8, 14.4, 15.6, 16, 17.7, 18.1, 19.5, 20]
y = [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]

plt.scatter(x, y)
plt.xlabel("x")
plt.ylabel("y")
plt.show

log_scatter.png

Ich denke, der einfachste Ansatz für das Klassifizierungsproblem ist die lineare Diskriminierung.

Im linearen Modell ist die Ausgabe $ y $ in Bezug auf die Eingabe $ x $ ($ y (x) = \ beta_0 + \ beta_1 x $) linear, und $ y $ ist ein reeller Wert. Hier ist ein weiterer Schritt zur Anpassung an das Klassifizierungsproblem.

Beispielsweise können Sie eine lineare Funktion mit der nichtlinearen Funktion $ f (・) $ transformieren.

y(x) = f(\beta_0 + \beta_1 x)

In diesem Fall kann beispielsweise die folgende Aktivierungsfunktion in Betracht gezogen werden.

f(z) = \left\{
\begin{array}{ll}
1 & (z \geq 0.5) \\
0 & (z \lt 0.5)
\end{array}
\right.

Nun, dieses Mal werden wir mit dieser Aktivierungsfunktion eine Vorhersage treffen. Zuerst werden wir das lineare Modell trainieren. Wir werden die Methode der kleinsten Quadrate verwenden, um die Parameter zu schätzen.

Abgesehen davon wird dieses Buch als Ausgangspunkt für den Start des maschinellen Lernens dringend empfohlen. Es beginnt mit dem Minimum an Mathematik, um maschinelles Lernen zu lernen. Diese Art von Buch ist etwas unbekannt. Es ist ein ziemlich gutes Buch. Außerdem ist der Code sehr einfach zu lesen. Ich denke, dass ich die Bibliothek in der Praxis nutzen werde, aber ich denke, dass es das Beste ist, wenn man für das Lernen von Grund auf neu schreibt.

Der Originalcode wird auf der Support-Seite veröffentlicht.

import matplotlib.pyplot as plt
import numpy as np


def reg(x,y):
    n = len(x)
    a = ((np.dot(x,y) - y.sum() * x.sum() / n) /
        ((x**2).sum() - x.sum()**2 / n))
    b = (y.sum() - a * x.sum()) / n
    return a,b


x = np.array(x)
y = np.array(y)
a, b = reg(x,y)

print('y =', b,'+', a, 'x')

fig = plt.scatter(x, y)
xmax = x.max()
plt.plot([0, xmax], [b, a * xmax + b])
plt.axhline(0.5, ls = "--", color = "r")
plt.axhline(0, linewidth = 1, ls = "--", color = "black")
plt.axhline(1, linewidth = 1, ls = "--", color = "black")
plt.xlabel("x")
plt.ylabel("y")
plt.show

Das geschätzte Modell ist

\hat{y} = -0.206 + 0.07x

ist geworden.

log_reg.png

In Anbetracht der Konvertierung durch die zuvor definierte Aktivierungsfunktion scheint die Grenzlinie ungefähr $ x = 10 $ zu sein.

Nun gibt es einige Probleme mit dieser Methode. Die Methode der kleinsten Quadrate entspricht der wahrscheinlichsten Methode, wenn für die bedingte Wahrscheinlichkeitsverteilung eine Normalverteilung angenommen wird.

Andererseits verursacht ein binärer objektiver Variablenvektor wie dieser verschiedene Probleme, da er eindeutig weit von der Normalverteilung entfernt ist. Einzelheiten finden Sie unter "Mustererkennung und maschinelles Lernen (Bischof)", jedoch hauptsächlich

-Die Approximationsgenauigkeit des Klassen-Posterior-Wahrscheinlichkeitsvektors ist schlecht. -Die Flexibilität des linearen Modells ist gering. ⇒Der Wert der Wahrscheinlichkeit überschreitet aufgrund dieser beiden Werte $ [0,1] $.

・ Bestrafen Sie zu korrekte Vorhersagen.

Kann zur Verfügung gestellt werden. Daher nehmen wir ein geeignetes Wahrscheinlichkeitsmodell an und betrachten einen Klassifizierungsalgorithmus, der bessere Eigenschaften als die Methode der kleinsten Quadrate aufweist.

Logistische Verteilung

Bevor wir uns mit der logistischen Regression befassen, sollten wir uns eingehend mit der logistischen Verteilung befassen. Bei gegebenem Eingabevektor $ x $ ist die bedingte Wahrscheinlichkeit der Klasse $ C_1 $

\begin{eqnarray}
P(y=1|x)&=&\frac{P(x|y=1)P(y=1)}{P(x|y=1)P(y=1)+P(x|y=0)P(y=0)}\\
\\
&=&\frac{1}{1+\frac{P(x|y=0)P(y=0)}{P(x|y=1)P(y=1)}}\\
\\
&=&\frac{1}{1+e^{-\log\frac{P(x|y=0)P(y=0)}{P(x|y=1)P(y=1)}}}\\
\end{eqnarray}

\log\frac{P(x|y=0)P(y=0)}{P(x|y=1)P(y=1)}=aWenn du sagst

P(y=1|x)=\frac{1}{1+e^{-a}}\\

Wird sein. Dies wird als logistische Verteilung bezeichnet und durch $ \ sigma (a) $ dargestellt.

Die Form der Verteilungsfunktion ist wie folgt.

import numpy as np
from  matplotlib import pyplot as plt

a = np.arange(-8., 8., 0.001)
y = 1 / (1+np.exp(-a))

plt.plot(a, y)
plt.axhline(0, linewidth = 1, ls = "--", color = "black")
plt.axhline(1, linewidth = 1, ls = "--", color = "black")
plt.xlabel("a")
plt.ylabel("σ (a)")
plt.show()

logit_P.png

Sie können sehen, dass der Wertebereich innerhalb von $ (0,1) $ liegt.



## Mittelwert und Varianz der logistischen Verteilung Wie oben erwähnt, ist die Verteilungsfunktion der logistischen Verteilung
\sigma(x)=\frac{1}{1+e^{-x}}

Es wird vertreten durch. Die Wahrscheinlichkeitsdichtefunktion $ f (x) $ unterscheidet $ \ sigma (x) $ und

\begin{eqnarray}
f(x)&=&\frac{d}{dx}\frac{1}{1+e^{-x}}\\
\\
&=&\frac{e^{-x}}{(1+e^{-x})^2}
\end{eqnarray}

Es wird sein. Die Form der Wahrscheinlichkeitsdichtefunktion ist wie folgt.

import numpy as np
from  matplotlib import pyplot as plt

x = np.arange(-8., 8., 0.001)
y = np.exp(-x) / ((1+np.exp(-x))**2)

plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("f (x)")
plt.show()

logit_f.png

Bei einer gegebenen Verteilung möchten die Menschen den Mittelwert und die Varianz kennen. Ich werde es sofort berechnen. Die Produktfaktormatrix $ M (t) $ ist

M(t) = \int_{-\infty}^{\infty}e^{tx}\frac{e^{-x}}{(1+e^{-x})^2}dx

Durch Ersetzen von $ \ frac {1} {(1 + e ^ {-x})} = y $

\begin{eqnarray}
M(t) &=& \int_{0}^{1}e^{-t\log(\frac{1}{y}-1)}dy\\
\\
&=& \int_{0}^{1}(\frac{1}{y}-1)^{-t}dy\\
\\
&=& \int_{0}^{1}(\frac{1-y}{y})^{-t}dy\\
\\
&=& \int_{0}^{1}(\frac{1}{y})^{-t}(1-y)^{-t}dy\\
\\
&=& \int_{0}^{1}y^t(1-y)^{-t}dy\\
\\
&=& \int_{0}^{1}y^{(t+1)-1}(1-y)^{(-t+1)-1}dy\\
\\
&=& Beta(t+1,1-t)\\
\\
&=& \frac{\Gamma(t+1)\Gamma(1-t)}{\Gamma((t+1)+(1-t))}\\
\\
&=& \frac{\Gamma(t+1)\Gamma(1-t)}{\Gamma(2)}=\Gamma(t+1)\Gamma(1-t)
\end{eqnarray}

(Shindo ...!)

Wenn der Auftragsaustausch von Differenzierung und Integration erlaubt ist (der Auftrag kann ohne Beweis ausgetauscht werden), ist die Differenzierung erster Ordnung dieser Produktfaktormatrix

\begin{eqnarray}
\frac{dM(t)}{dt}=\Gamma'(t+1)\Gamma(1-t)-\Gamma(t+1)\Gamma'(1-t)
\end{eqnarray}

Und wenn $ t = 0 $,

\begin{eqnarray}
M'(0)=\Gamma'(1)\Gamma(1)-\Gamma(1)\Gamma'(1)=0
\end{eqnarray}

Das heißt, $ E [X] = M '(0) = 0 $. Dann finden Sie $ E [X ^ 2] $.

\begin{eqnarray}
\frac{d^2M(t)}{dt^2}&=&\Gamma''(t+1)\Gamma(1-t)-\Gamma'(t+1)\Gamma'(1-t)-\Gamma'(t+1)\Gamma'(1-t)+\Gamma'(t+1)\Gamma''(1-t)\\
\\
&=& \Gamma''(t+1)\Gamma(1-t)-2\Gamma'(t+1)\Gamma'(1-t)+\Gamma(t+1)\Gamma''(1-t)
\end{eqnarray}

Wenn $ t = 0 $,

\begin{eqnarray}
M''(0)&=&\Gamma''(1)-2\Gamma'(1)^2+\Gamma''(1)\\
\\
&=& 2\Gamma''(1)-2\Gamma'(1)^2
\end{eqnarray}

Geben Sie hier $ \ psi (x) = \ frac {d} {dx} \ log \ Gamma (x) = \ frac {\ Gamma '(x)} {\ Gamma (x)} $ ein und differenzieren Sie dies. Dann

\begin{eqnarray}
\frac{d}{dx}\psi(x)=\frac{\Gamma''(x)\Gamma(x)-\Gamma'(x)^2}{\Gamma(x)^2}
\end{eqnarray}

Das heißt, $ \ psi '(0) = \ Gamma' '(1) - \ Gamma' (1) ^ 2 $. Übrigens, $ \ psi '(0) = \ zeta (2) $ [wahrscheinlich](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%82 % AC% E3% 83% B3% E3% 83% 9E% E9% 96% A2% E6% 95% B0) [^ 1] Also $ \ psi '(0) = \ frac {\ pi ^ 2} Es wird als 6} $ berechnet.

Daher ist $ M '' (0) = 2 × \ frac {\ pi ^ 2} {6} $ und $ E [X ^ 2] = M '' (0) = \ frac {\ pi ^ 2} { Ich konnte um 3} $ bitten. Als das,

\begin{eqnarray}
V[X]&=&E[X^2]-E[X]^2\\
\\
&=& \frac{\pi^2}{3} - 0\\
\\
&=& \frac{\pi^2}{3}
\end{eqnarray}

Es stellt sich heraus, dass der erwartete Wert der logistischen Verteilung $ 0 $ und die Varianz $ \ frac {\ pi ^ 2} {3} $ beträgt.

Übrigens scheint die Ableitung der logarithmischen Gammafunktion als Polygammafunktion bezeichnet zu werden. Insbesondere soll die Ableitung erster Ordnung die Digammafunktion sein.

(Es war hart und plötzlich kam die $ ζ $ -Funktion heraus und ich war mir nicht sicher, also kann ich nicht sagen, dass ich es berechnen könnte ...)



## Logistische Rückgabe

Betrachten Sie nun $ p = \ sigma (\ beta x) $, wenn die Parameter der logistischen Verteilung durch eine lineare Verbindung dargestellt werden. Lösen Sie dies für $ \ beta x $

\begin{eqnarray}
p &=& \frac{1}{1+e^{-\beta x}}\\
\\
(1+e^{-\beta x})p &=& 1\\
\\
p+e^{-\beta x}p &=& 1\\
\\
e^{-\beta x} &=& \frac{1-p}{p}\\
\\
-\beta x &=& \log\frac{1-p}{p}\\
\\
\beta x &=& \log\frac{p}{1-p}\\
\\
\end{eqnarray}

(Gleiche Positionen sind ausgerichtet, aber es ist etwas schwer zu sehen ...)

Die rechte Seite wird im Bereich Statistik als Log Odds bezeichnet.

Was ich sagen möchte ist, dass umgekehrt, wenn Sie die logarithmischen Quoten linear zurückführen und nach $ p $ auflösen, Sie eine Schätzung der Wahrscheinlichkeit erhalten, dass jede Klasse zugewiesen wird.

Übrigens sind für $ p \ in [0,1] $ die Gewinnchancen $ \ frac {p} {1-p} \ in [0, \ infty) $ und die logarithmischen Gewinnchancen sind $ \ log \ frac { Da es p} {1-p} \ in (- \ infty, \ infty) $ ist, können wir auch sehen, dass der Bereich der logarithmischen Quoten dem Bereich der linearen Funktionen entspricht.



## Schätzung der logistischen Regressionsparameter Ich werde den Überblick verlieren, was es ist, also werde ich die Buchstaben und Symbole sortieren. Datensatz $ D = \\ {X, Y \\}, $
Y = \left(
\begin{array}{c}
y_1\\
\vdots\\
y_n
\end{array}
\right),\quad y_i \in \{ 0,1 \},(i=1,...n)

In Bezug auf $ X $ möchte ich einen konstanten Term in den Parameter aufnehmen, aber es ist schwierig, die Notation zu ändern

X = \left(
\begin{array}{cccc}
1 & x_{11} & \cdots & x_{1d}\\\

\vdots & \vdots & \ddots & \vdots \\\
1 & x_{n1} & \cdots & x_{nd}
\end{array}
\right)

Ich würde gerne sagen, dass. Für $ i = 1, ..., n $ sei $ x_i = (1, x_ {i1}, ..., x_ {id}) ^ T $ (dh $ x_i $ ist $ X. Inversion der Zeilenkomponente von $)).

Die Wahrscheinlichkeitsfunktion für den Parametervektor $ \ beta = (\ beta_0, \ beta_1, ..., \ beta_d) $

L(\beta) = P(Y | \beta)= \prod_{i=1}^{n} \sigma(\beta x_i)^{y_i}\{1-\sigma(\beta x_i)\}^{1-y_i}

Kann geschrieben werden als, die logarithmische Wahrscheinlichkeitsfunktion,

E(\beta)=-\log L(\beta)= -\sum_{i=1}^{n}\{y_i\log \sigma(\beta x_i)+(1-y_i)\log(1-\sigma(\beta x_i))\}

Kann geschrieben werden als. Suchen Sie den Parameter $ \ beta $, indem Sie dieses Minimierungsproblem lösen.

Aufgrund der Nichtlinearität von $ \ sigma $ kann die wahrscheinlichste Lösung jedoch nicht analytisch abgeleitet werden.

Da $ E $ jedoch eine konvexe Funktion ist, hat es nur die kleinste Lösung. Finden Sie diese Mindestlösung nach der Newton-Methode.


## Newton-Methode

Die Newton-Methode wird auch als Newton-Rafson-Methode bezeichnet. Ich werde Ihnen viel über die Newton-Methode erzählen, wenn ich den Google-Lehrer frage, ohne ein Memo zu machen, also werde ich die Erklärung dort belassen. Die frühe Geschichte ist, wie man die Lösung einer Gleichung durch numerische Berechnung findet. In dem Buch habe ich

・ P247 der Essenz des maschinellen Lernens (Kato) ・ Mustererkennung und maschinelles Lernen (Bischof) P207 ・ P140 der Grundlagen des statistischen Lernens (Hastie) ・ P74 der Galois-Theorie (Fujita), die gelöst werden kann

Es gibt eine Erklärung in etc.



## Ich bin erschöpft. Ich hätte nicht gedacht, dass es so schwierig sein würde, nur den Mittelwert und die Varianz der logistischen Verteilung zu berechnen. Ich bin erschöpft.

## ★ Referenzen ★ [1] Kato: Die Essenz des maschinellen Lernens (2018) [2] Hastie, Tibshirani, Friedman: Grundlagen des statistischen Lernens (2014) [3] Bischof: Mustererkennung und maschinelles Lernen (2006) [4] Fujita: Galois-Theorie, die gelöst werden kann (2013)

[^ 1]: Wenn Sie nachschlagen, werden Sie verschiedene Dinge finden, aber da es viele direkte PDF-Links wie Vorlesungsmaterialien gibt, habe ich einen Wikipedia-Link.

Recommended Posts

Als ich versuchte, über logistische Regression zu schreiben, fand ich schließlich den Mittelwert und die Varianz der logistischen Verteilung.
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
[Python] Ich habe die Theorie und Implementierung der logistischen Regression gründlich erklärt
Ich wurde entsetzt, als ich versuchte, mithilfe von PCA und NMF die Anzahl der Merkmale eines animierten Gesichts zu ermitteln.
Ich habe versucht, die Höhen und Tiefen des Schlusskurses des Aktienkurses von Guru Navi mit TensorFlow vorherzusagen (Fortschritt)
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, zum Zeitpunkt der Bereitstellung mit Fabric und ChatWork Api automatisch in ChatWork zu posten
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Ich habe versucht, mich eingehender mit Sicherheit zu befassen, während ich die probabilistische Endgültigkeit von Proof of Work berechnet habe
[Grafikzeichnung] Ich habe versucht, ein mehrreihiges Balkendiagramm mit Matplotlib und Seaborn zu schreiben
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, die Umrisse von Big Gorilla herauszufinden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ubuntu explodierte, als ich versuchte, meinen Benutzernamen zu ändern
Ich habe versucht, die Uhrzeit und das heutige Wetter anzuzeigen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe den Chat von YouTube Live angezeigt und versucht zu spielen
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Ich habe versucht, die Exponentialfunktion und die Logistikfunktion an die Anzahl der COVID-19-positiven Patienten in Tokio anzupassen
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, einen einfachen Kredit-Score mit logistischer Regression zu erstellen.
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, Pepper über Ereignisinformationen und Mitgliederinformationen sprechen zu lassen
Ich habe zusammengefasst, wie die Boot-Parameter von GRUB und GRUB2 geändert werden
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht zu überprüfen, wie schnell der Mnist des Chainer-Beispiels mit Cython beschleunigt werden kann
Ich habe versucht, den Unterschied zwischen Config vor und nach der Arbeit mit pyATS / Genie selbst erstelltem Skript zu berücksichtigen
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!
Ich habe versucht, mich über MCMC zu organisieren.
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich versuchte zusammenzufassen, bis ich die Bank verließ und Ingenieur wurde