[PYTHON] Quand j'ai essayé d'écrire sur la régression logistique, j'ai fini par trouver la moyenne et la variance de la distribution logistique.

J'utilise souvent la régression logistique au travail, mais lorsque j'ai un peu d'inquiétude, j'ai souvent du mal à accéder aux informations que je veux, alors j'aimerais résumer la régression logistique dans mon propre mémo.

La régression logistique semble être souvent utilisée dans le domaine médical. Bien sûr, il est souvent utilisé dans d'autres domaines en raison de sa grande interprétabilité, de la simplicité du modèle et de sa grande précision.

Considérons maintenant le problème de prédire si le vecteur d'entrée $ x $ sera affecté aux deux classes $ C_0 ou C_1 $.

Soit $ y ∈ \ {0,1 \} $ la variable objective (sortie) et $ x ∈ R ^ d $ la variable explicative (entrée). Ici, $ y = 0 $ lorsqu'il est affecté à $ C_0 $ et $ y = 1 $ lorsqu'il est affecté à $ C_1 $.


## Discrimination linéaire J'ai préparé 20 données générées artificiellement (je viens de le faire correctement). Cette fois, j'utiliserai Python.

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

Je pense que l'approche la plus simple du problème de classification est la discrimination linéaire.

Dans le modèle linéaire, la sortie $ y $ est linéaire par rapport à l'entrée $ x $ ($ y (x) = \ beta_0 + \ beta_1 x $), et $ y $ est une valeur réelle. Voici une autre étape pour s'adapter au problème de classification.

Par exemple, vous pouvez transformer une fonction linéaire avec la fonction non linéaire $ f (・) $.

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

Par exemple, dans ce cas, la fonction d'activation suivante peut être envisagée.

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

Eh bien, cette fois, nous ferons une prédiction en utilisant cette fonction d'activation. Tout d'abord, nous allons former le modèle linéaire. Nous utiliserons la méthode des moindres carrés pour estimer les paramètres.

En passant, ce livre est fortement recommandé comme point de départ pour démarrer l'apprentissage automatique. Cela commence par les mathématiques minimales requises pour commencer à étudier l'apprentissage automatique. Ce type de livre est un peu inconnu. C'est un très bon livre. De plus, le code est très facile à lire. Je pense que je vais utiliser la bibliothèque dans la pratique, mais je pense que c'est le meilleur en termes d'écriture à partir de zéro pour étudier.

Le code original est publié sur la page d'assistance.

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

Le modèle estimé est

\hat{y} = -0.206 + 0.07x

est devenu.

log_reg.png

Ensuite, compte tenu de la conversion par la fonction d'activation définie précédemment, la ligne de démarcation semble être d'environ $ x = 10 $.

Maintenant, il y a quelques problèmes avec cette méthode. La méthode des moindres carrés équivaut à la méthode la plus probable lorsqu'une distribution normale est supposée pour la distribution de probabilité conditionnelle.

D'un autre côté, un vecteur variable objectif binaire comme celui-ci pose divers problèmes car il est clairement loin de la distribution normale. Pour plus de détails, reportez-vous à "Reconnaissance de formes et apprentissage automatique (Bishop)", mais principalement

-La précision d'approximation du vecteur de probabilité postérieure de classe est médiocre. -La flexibilité du modèle linéaire est faible. ⇒ La valeur de la probabilité dépasse $ [0,1] $ en raison de ces deux.

・ Pénaliser les prédictions trop correctes.

Peut être donné. Par conséquent, nous adoptons un modèle probabiliste approprié et considérons un algorithme de classification qui a de meilleures caractéristiques que la méthode des moindres carrés.

Distribution logistique

Avant d'entrer dans la régression logistique, réfléchissons beaucoup à la distribution logistique. Étant donné le vecteur d'entrée $ x $, la probabilité conditionnelle de la classe $ C_1 $ est

\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)}=aSi tu le dis

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

Sera. Ceci est appelé une distribution logistique et sera représenté par $ \ sigma (a) $.

La forme de la fonction de distribution est la suivante.

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

Vous pouvez voir que la plage de valeurs est comprise entre $ (0,1) $.



## Moyenne et variance de la distribution logistique Comme mentionné ci-dessus, la fonction de distribution de la distribution logistique est
\sigma(x)=\frac{1}{1+e^{-x}}

Il est représenté par. La fonction de densité de probabilité $ f (x) $ différencie $ \ sigma (x) $ et

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

Ce sera. La forme de la fonction de densité de probabilité est la suivante.

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

Étant donné une distribution, les gens veulent connaître la moyenne et la variance. Je vais le calculer immédiatement. La matrice des facteurs de produit $ M (t) $ est

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

En remplaçant $ \ 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 ...!)

De plus, si l'échange d'ordre de différenciation et d'intégration est autorisé (l'ordre peut être échangé sans preuve), la différenciation de premier ordre de cette matrice de facteurs de produit est

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

Et si $ t = 0 $,

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

Autrement dit, $ E [X] = M '(0) = 0 $. Puis trouvez $ 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}

Si $ t = 0 $,

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

Ici, mettez $ \ psi (x) = \ frac {d} {dx} \ log \ Gamma (x) = \ frac {\ Gamma '(x)} {\ Gamma (x)} $ et différenciez-le. Puis

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

Autrement dit, $ \ psi '(0) = \ Gamma' '(1) - \ Gamma' (1) ^ 2 $. À propos, $ \ psi '(0) = \ zeta (2) $ [probablement](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], donc $ \ psi '(0) = \ frac {\ pi ^ 2} { Il est calculé comme 6} $.

Par conséquent, $ M '' (0) = 2 × \ frac {\ pi ^ 2} {6} $, et $ E [X ^ 2] = M '' (0) = \ frac {\ pi ^ 2} { J'ai pu demander 3} $. Que ça,

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

Il s'avère que la valeur attendue de la distribution logistique est $ 0 $ et la variance est $ \ frac {\ pi ^ 2} {3} $.

À propos, il semble que la dérivée de la fonction gamma logarithmique s'appelle la fonction polygamma. En particulier, on dit que le dérivé du premier ordre est la fonction digamma.

(C'était difficile, et tout à coup la fonction $ ζ $ est sortie et je n'étais pas sûr, donc je ne peux pas dire que je pourrais le calculer ...)



## Retour logistique

Maintenant, considérons $ p = \ sigma (\ beta x) $ lorsque les paramètres de la distribution logistique sont représentés par une connexion linéaire. Résoudre cela pour $ \ 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}

(Les positions égales sont alignées, mais c'est un peu difficile à voir ...)

Le côté droit est appelé log cotes dans le domaine des statistiques.

Ce que je veux dire, c'est que, inversement, si vous régression linéairement les cotes logarithmiques et résolvez pour $ p $, vous obtiendrez une estimation de la probabilité que chaque classe soit attribuée.

Au fait, pour $ p \ in [0,1] $, les cotes sont $ \ frac {p} {1-p} \ in [0, \ infty) $, et les cotes logarithmiques sont $ \ log \ frac { Puisqu'il est p} {1-p} \ in (- \ infty, \ infty) $, nous pouvons également voir que la plage des cotes logarithmiques est la même que la plage des fonctions linéaires.



## Estimation des paramètres de régression logistique Je vais perdre de vue ce que c'est, alors je vais trier les lettres et les symboles. Ensemble de données $ 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)

En ce qui concerne $ X $, je voudrais inclure un terme constant dans le paramètre, mais il est difficile de changer la notation, donc

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

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

Je voudrais dire cela. Aussi, pour $ i = 1, ..., n $, soit $ x_i = (1, x_ {i1}, ..., x_ {id}) ^ T $ (c'est-à-dire que $ x_i $ est $ X) Inversion du composant de ligne de $)).

La fonction de vraisemblance pour le vecteur de paramètres $ \ 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}

Peut être écrit comme, la fonction de vraisemblance logarithmique,

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))\}

Peut être écrit comme. Trouvez le paramètre $ \ beta $ en résolvant ce problème de minimisation.

Cependant, en raison de la non-linéarité de $ \ sigma $, la solution la plus probable ne peut pas être dérivée analytiquement.

Cependant, puisque $ E $ est une fonction convexe, elle n'a que la plus petite solution. Trouvez cette solution minimale par la méthode Newton.


## Méthode Newton

La méthode Newton est également appelée méthode Newton-Rafson. Je vous en dirai beaucoup sur la méthode Newton si je demande au professeur Google sans faire de mémo, je vais donc laisser l'explication là-bas. La première histoire est de savoir comment trouver la solution d'une équation par calcul numérique. Dans le livre que j'ai

・ P247 d'Essence d'apprentissage automatique (Kato) ・ Reconnaissance de formes et apprentissage automatique (Bishop) P207 ・ P140 des bases de l'apprentissage statistique (Hastie) ・ P74 de la théorie de Galois (Fujita) qui peut être résolue

Il y a une explication dans etc.



## Je suis épuisé. Je ne pensais pas qu'il serait si difficile de calculer la moyenne et la variance de la distribution logistique. Je suis épuisé.

## ★ Références ★ [1] Kato: l'essence de l'apprentissage automatique (2018) [2] Hastie, Tibshirani, Friedman: Bases de l'apprentissage statistique (2014) [3] Bishop: reconnaissance de formes et apprentissage automatique (2006) [4] Fujita: théorie de Galois qui peut être résolue (2013)

[^ 1]: Si vous le recherchez, vous trouverez diverses choses, mais comme il existe de nombreux liens directs pdf tels que des supports de cours, des liens wikipedia sont fournis.

Recommended Posts

Quand j'ai essayé d'écrire sur la régression logistique, j'ai fini par trouver la moyenne et la variance de la distribution logistique.
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
[Python] J'ai expliqué en détail la théorie et la mise en œuvre de la régression logistique
Je suis devenu horreur quand j'ai essayé de détecter la quantité de fonctionnalités d'un visage animé en utilisant PCA et NMF.
J'ai essayé de prédire les hauts et les bas du cours de clôture du cours de l'action de Guru Navi en utilisant TensorFlow (progression)
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
J'ai essayé d'approfondir la sécurité tout en calculant la finalité probabiliste de la preuve de travail
[Dessin graphique] J'ai essayé d'écrire un graphique à barres multi-séries avec matplotlib et seaborn
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de découvrir les grandes lignes de Big Gorilla
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Ubuntu a explosé lorsque j'ai essayé de changer mon nom d'utilisateur
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
Je veux connaître la nature de Python et pip
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai affiché le chat de YouTube Live et essayé de jouer
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
J'ai essayé d'adapter la fonction exponentielle et la fonction logistique au nombre de patients positifs au COVID-19 à Tokyo
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé de créer un pointage de crédit simple avec régression logistique.
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé de laisser Pepper parler des informations sur l'événement et des informations sur les membres
J'ai résumé comment changer les paramètres de démarrage de GRUB et GRUB2
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé de vérifier à quelle vitesse la mnist de l'exemple Chainer peut être accélérée en utilisant cython
J'ai essayé de faire la différence de Config avant et après le travail avec le script pyATS / Genie self-made
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé de m'organiser à propos de MCMC.
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé de résumer jusqu'à ce que je quitte la banque et devienne ingénieur