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.
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!
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
La direction est bonne. Alors la prochaine fois, j'écrirai sur la version multi-classes.
Recommended Posts