[PYTHON] Explication et mise en œuvre de PRML Chapitre 4

Notes d'apprentissage PRML

Maintenant que je suis en charge de la présentation de la conférence ronde dans le chapitre 4 de "Reconnaissance de formes et apprentissage automatique", je voudrais écrire sur ce que j'ai étudié et un petit commentaire. Je suis l'une des personnes qui ont eu du mal avec ce livre, donc je serais très heureux si cela pouvait être utile quand il y a des gens avec des circonstances similaires à l'avenir. Si vous constatez des erreurs mathématiques ou indiquez qu'il vaut mieux le faire, n'hésitez pas à nous contacter.

Discrimination linéaire de Fisher

2 cours

Le terme de la fonction discriminante part du carré minimum, mais le carré minimum est omis car c'est la conclusion qu '"il est naturel qu'il ne puisse pas être utilisé correctement". Donc à partir de la 2e classe Fisher. Ici, nous examinons la discrimination linéaire du point de vue de la réduction de dimension.

Obtenez un vecteur D-dimensionnel en entrée et projetez-le dans une dimension avec la formule suivante

python


y = \boldsymbol{w}^T\boldsymbol{x}

Définissez un seuil pour $ y $ et classez-le dans la classe $ C_1 $ lorsque $ y \ ge -w_0 $, sinon classez-le comme $ C_2 $. Une perte d'informations se produira lorsque la dimension est supprimée, donc je voudrais ajuster $ \ boldsymbol {w} $ pour maximiser la séparation des classes.

Ici, en supposant qu'il y a $ N_1 $ points dans la classe $ C_1 $ et $ N_2 $ points dans $ C_2 $, le vecteur moyen de chaque classe est

python


\boldsymbol{m}_1 = \frac{1}{N_1}\sum_{n \in C_1}\boldsymbol{x}_n, \quad
\boldsymbol{m}_2 = \frac{1}{N_2}\sum_{n \in C_2}\boldsymbol{x}_n

À ce stade, sur la base de l'idée de "Projetons où les moyennes des classes sont les plus éloignées", sélectionnez $ \ boldsymbol {w} $ qui maximise la formule suivante.

python


m_2 - m_1 = \boldsymbol{w}^T(\boldsymbol{m}_2 - \boldsymbol{m}_1)

Ici, $ m_k $ représente la moyenne des données projetées à partir de $ C_k $. Comme cela n'a pas de sens si $ \ boldsymbol {w} $ peut être augmenté autant que possible, une contrainte de norm = 1 est ajoutée. La méthode du multiplicateur indécis de Lagrange entre en jeu. Si vous connaissez les bases de la différenciation vectorielle, il n'y a pas de problème.

python


L = \boldsymbol{w}^T(\boldsymbol{m}_2 - \boldsymbol{m}_1) + \lambda(\boldsymbol{w}^T\boldsymbol{w}-1)\\
\\
\nabla L=(\boldsymbol{m}_2 - \boldsymbol{m}_1)+2\lambda\boldsymbol{w}\\
\\
\boldsymbol{w}=-\frac{1}{2\lambda}(\boldsymbol{m}_2 - \boldsymbol{m}_1)\propto(\boldsymbol{m}_2 - \boldsymbol{m}_1)

Cependant, en réalité, cela peut toujours entraîner le chevauchement des classes. Par conséquent, je voudrais prendre une méthode telle que "la même classe est regroupée après projection, et les classes sont séparées les unes des autres". Par conséquent, nous avons introduit les critères de discrimination de Fisher. Distribution intraclasse de chaque classe

python


s_k^2 = \sum_{n \in C_k}(y_k - m_k)^2

Par conséquent, les critères de discrimination sont les suivants

python


J(\boldsymbol{w}) = \frac{(m_2-m_1)^2}{s_1^2 + s_2^2}

Le dénominateur est la distribution au sein de la classe totale, définie par la somme des distributions de chaque classe. Les molécules sont dispersées entre les classes. Dans cette section, ceci est réécrit comme suit.

python


J(\boldsymbol{w}) = \frac{\boldsymbol{w}^T\boldsymbol{S}_\boldsymbol{B}\boldsymbol{w}}{\boldsymbol{w}^T\boldsymbol{S}_\boldsymbol{W}\boldsymbol{w}}

ici

python


\boldsymbol{S}_\boldsymbol{B} = (\boldsymbol{m}_2 - \boldsymbol{m}_1)(\boldsymbol{m}_2 - \boldsymbol{m}_1)^T\\
\\
\boldsymbol{S}_\boldsymbol{W} =\sum_{k}\sum_{n\in C_k}(\boldsymbol{x}_n-m_k)(\boldsymbol{x}_n-m_k)
^T

La première est appelée matrice de covariance interclasse, et la seconde est appelée matrice de covariance intraclasse totale. J'étais confus parce que cela me paraissait un peu difficile, mais si je l'élargis en utilisant le fait que le dénominateur et la molécule sont $ y = \ boldsymbol {w} ^ T \ boldsymbol {x} $, l'original Il s'avère que c'est la même chose que la formule.

Par conséquent, en différenciant J (w) par rapport à w et en le mettant à zéro, w qui maximise J peut être obtenu.

python



\frac{\partial J}{\partial w}=\frac{(2(\boldsymbol{S}_\boldsymbol{B}\boldsymbol{w})(\boldsymbol{w}^T\boldsymbol{S}_\boldsymbol{W}\boldsymbol{w})-2(\boldsymbol{S}_\boldsymbol{W}\boldsymbol{w})(\boldsymbol{w}^T\boldsymbol{S}_\boldsymbol{B}\boldsymbol{w}))}{(\boldsymbol{w}^T\boldsymbol{S}_\boldsymbol{W}\boldsymbol{w})^2}=0\\
\\\\
(\boldsymbol{S}_\boldsymbol{W}\boldsymbol{w})(\boldsymbol{w}^T\boldsymbol{S}_\boldsymbol{B}\boldsymbol{w}) = (\boldsymbol{S}_\boldsymbol{B}\boldsymbol{w})(\boldsymbol{w}^T\boldsymbol{S}_\boldsymbol{W}\boldsymbol{w})

$ \ Boldsymbol {w} ^ T \ boldsymbol {S} _ \ boldsymbol {W} \ boldsymbol {w} $ est un scalaire et la matrice de covariance est une matrice symétrique lors de la différenciation de la forme quadratique Le fait est que je l'utilise. J'écrirai à ce sujet dans un autre article.

Comme précédemment, l'important cette fois est l'orientation de $ \ boldsymbol {w} $, pas la taille, donc $ \ boldsymbol {S} _ \ boldsymbol {B} \ boldsymbol {w} $

python


\boldsymbol{S}_\boldsymbol{B}\boldsymbol{w} = (\boldsymbol{m}_2 - \boldsymbol{m}_1)(\boldsymbol{m}_2 - \boldsymbol{m}_1)^T\boldsymbol{w}

En profitant du fait qu'il s'agit d'un vecteur dans le même sens que $ (\ boldsymbol {m} _2- \ boldsymbol {m} _1) $

python


\boldsymbol{w} \propto \boldsymbol{S}_\boldsymbol{W}^-1(\boldsymbol{m}_2 - \boldsymbol{m}_1)

Maintenant que la direction de w a été décidée, c'est tout!

Extra: j'ai essayé d'en faire un code

fisher_2d.py


# Class 1
mu1 = [5, 5]
sigma = np.eye(2, 2)
c_1 = np.random.multivariate_normal(mu1, sigma, 100).T

# Class 2
mu2 = [0, 0]
c_2 = np.random.multivariate_normal(mu2, sigma, 100).T

# Average vectors
m_1 = np.sum(c_1, axis=1, keepdims=True) / 100.
m_2 = np.sum(c_2, axis=1, keepdims=True) / 100.

# within-class covariance matrix 
S_W = np.dot((c_1 - m_1), (c_1 - m_1).T) + np.dot((c_2 - m_2), (c_2 - m_2).T)

w = np.dot(np.linalg.inv(S_W), (m_2 - m_1))
w = w/np.linalg.norm(w)

plt.quiver(4, 2, w[1, 0], -w[0, 0], angles="xy", units="xy", color="black", scale=0.5)
plt.scatter(c_1[0, :], c_1[1, :])
plt.scatter(c_2[0, :], c_2[1, :])

Voici le résultat du tracé du vecteur obtenu à l'aide du carquois

Screen Shot 2020-04-30 at 19.58.45.png

La direction est bonne. Alors la prochaine fois, j'écrirai sur la version multi-classes.

Recommended Posts

Explication et mise en œuvre de PRML Chapitre 4
Explication et mise en œuvre de SocialFoceModel
Explication et implémentation de l'algorithme ESIM
Explication et mise en œuvre du perceptron simple
Explication et implémentation de l'algorithme Decomposable Attention
Explication de la distance d'édition et de l'implémentation en Python
Introduction et mise en œuvre de JoCoR-Loss (CVPR2020)
Introduction et mise en œuvre de la fonction d'activation
PRML Chapitre 5 Implémentation Python du réseau neuronal
PRML Chapitre 3 Preuve Implémentation approximative de Python
Explication du CSV et exemple d'implémentation dans chaque langage de programmation
Explication mathématique de la recherche de dichotomie et de trisection et méthode de mise en œuvre sans bogues
PRML Chapter 13 Estimation la plus probable Implémentation Python du modèle de Markov caché
Mise en œuvre et expérience de la méthode de clustering convexe
PRML Chapitre 4 Implémentation Python de la régression logistique bayésienne
PRML Chapter 5 Implémentation Python de réseau à densité mixte
PRML Chapitre 9 Implémentation Python de distribution gaussienne mixte
PRML Chapitre 14 Implémentation Python de modèle mixte conditionnel
Implémentation PRML Chapitre 3 Modèle de fonction de base linéaire
PRML Chapitre 10 Implémentation Python de distribution gaussienne mixte
PRML Chapitre 6 Implémentation Python Gaussian Return
PRML Chapter 2 Student t-Distribution Python Implementation
PRML Chapitre 1 Implémentation de Python pour l'ajustement de courbe bayésienne
Implémentation et description à l'aide de XGBoost pour les débutants
Explication et implémentation du protocole XMPP utilisé dans Slack, HipChat et IRC
Comparaison d'exemples d'implémentation de k-means de scikit-learn et pyclustering
PRML Chapitre 11 Implémentation Python Monte Carlo Chaîne de Markov
[Python] Chapitre 02-01 Bases des programmes Python (opérations et variables)
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python
Implémentation de l'arbre TRIE avec Python et LOUDS
Complètement compris le chapitre 1 de "Make and Move ALife"
Complètement compris le chapitre 3 de "Créer et déplacer ALife"
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
[Python of Hikari-] Chapitre 06-02 Fonction (argument et valeur de retour 1)
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
Mise à jour séquentielle de la co-distribution pour la dérivation et l'implémentation des expressions
Implémentation de la séquence de Fibonacci
J'ai touché Bergeronnette (3). Enquête et mise en place de messages pop-up.
Principes de base et mise en œuvre de Perceptron
Implémentation de l'écran de l'administrateur DB par Flask-Admin et Flask-Login
Explication des outils et commandes de package pour le système d'exploitation Linux
[Python] Chapitre 01-02 À propos de Python (Exécution et installation de l'environnement de développement)
Module [Python of Hikari-] Chapitre 08-03 (Importation et utilisation de la bibliothèque standard)
Implémentation Python du mode de fusion CSS3 et discussion sur l'espace colorimétrique
[Deep Learning from scratch] Implémentation de la méthode Momentum et de la méthode AdaGrad
Dérivation et implémentation d'équations de mise à jour pour la décomposition de facteurs tensoriels non négatifs
[Hikari-Python] Chapitre 05-10 Syntaxe de contrôle (interruption et poursuite du traitement itératif)
[Avec une explication simple] Implémentation Scratch d'une machine Boltsman profonde avec Python ②
[Avec une explication simple] Implémentation Scratch d'une machine Boltzmann profonde avec Python ①
Théorie et mise en œuvre de modèles de régression multiple - pourquoi une régularisation est nécessaire -
Vérification et mise en œuvre de la méthode de reconstruction vidéo en utilisant GRU et Autoencoder
PRML Chapter 7 Implémentation de Python Vector Machine associée pour les problèmes de régression
Implémentation informatique quantique de Quantum Walk 2
Mécanisme de pyenv et virtualenv
Implémentation de TF-IDF à l'aide de gensim
Implémentation de MathJax sur Sphinx
Pré-traitement et post-traitement de pytest
Combinaison de récursif et de générateur
Combinaison de anyenv et direnv