Cet article est écrit par des débutants en apprentissage automatique. Notez s'il vous plaît.
Le premier article est ici. Le deuxième article est ici.
Dans cet article, je vais expliquer le contexte de l'idée à l'aide de formules mathématiques.
L'estimation de la densité du noyau consistait à estimer la fonction de densité de probabilité avec la fonction de noyau. Alors, quelle était exactement la fonction de densité de probabilité?
La fonction de densité de probabilité représente la distribution de l'accessibilité ***. *** Pour l'événement A, une valeur x avec une densité de probabilité élevée *** signifie que lorsque l'événement A se produit, la probabilité que la valeur à ce moment-là soit x est relativement élevée ***. Remplaçons "événement A" par "étiquette 0". «À la valeur x, la densité de probabilité de l'étiquette 0 est élevée» signifie «lorsque certaines données sont l'étiquette 0, la probabilité que les données aient la valeur x est relativement élevée».
Il faut noter ici que la densité de probabilité ≠ la probabilité. La densité de probabilité est «une relative facilité d'apparition pour un événement spécifique», et il n'y a aucune garantie qu'elle puisse être comparée à la densité de probabilité d'autres événements. En premier lieu, la probabilité qu'une valeur spécifique apparaisse dans les données continues n'est pas définie. La probabilité ne peut pas être calculée sans une certaine plage.
P(X=x)=0 \\ P(X \leqq x)=p
En intégrant la fonction de densité de probabilité, vous pouvez trouver la probabilité dans cet intervalle (ou cette région s'il s'agit de deux dimensions ou plus). Ainsi, la probabilité d'une valeur particulière "proche" peut être calculée, probablement. Plus la densité de probabilité de la valeur x est élevée, plus la probabilité d'apparition de la valeur x "proche" est élevée, et plus la densité de probabilité de la valeur x est faible, plus la probabilité d'apparition de la valeur x "proche" est faible.
Je voudrais vous donner un exemple. À la valeur x, la densité de probabilité de l'étiquette 1 est supérieure à la densité de probabilité de l'étiquette 0. En ce moment,
--Probabilité de la valeur x "proche" lorsque l'étiquette vaut 0 --Probabilité de la valeur x "proche" lorsque l'étiquette vaut 1
Lequel est le plus élevé? Ce n'est pas strict, mais intuitivement, ce dernier semble être plus élevé (divers). A l'avenir, nous procéderons à des discussions en supposant que cette intuition est correcte.
Réécrivez «étiquette 0» comme «y = 0» et «étiquette 1» comme «y = 1». Ensuite, l'histoire jusqu'à présent
Densité de probabilité de l'étiquette 0 à la valeur x \ leqq Densité de probabilité de l'étiquette 1 à la valeur x \\
\ Rightarrow Probabilité de valeur x lorsque y = 0 \ leqq Probabilité de valeur x lorsque y = 1 \\
\Rightarrow P(x|y=0) \leqq P(x|y=1)
Il se résume ainsi. Cependant, c'est exactement la valeur x "proche".
Pour la valeur x
P(y=0|x) \leqq P(y=1|x)
Si, alors il est logique d'attribuer l'étiquette 1 au lieu de l'étiquette 0. Par conséquent, si vous pouvez trouver la probabilité de «étiquette 0 ou étiquette 1» et la probabilité conditionnelle sous la condition «d'extraction de la valeur x», vous gagnerez.
Réécrivons cette inégalité en utilisant le théorème de Bayes.
P(y=0|x) \leqq P(y=1|x) \\ \Leftrightarrow
\frac{P(x|y=0)P(y=0)}{P(x)} \leqq \frac{P(x|y=1)P(y=1)}{P(x)}
Le dénominateur P (x) est commun et est supérieur ou égal à 0. Après tout
P(x|y=0)P(y=0) \leqq P(x|y=1)P(y=1)
Si tu peux montrer
P(y=0|x) \leqq P(y=1|x)
Peut être dit de tenir. Maintenant en utilisant l'estimation de la densité du noyau
P(x|y=0) \leqq P(x|y=1)
Je le sais. Par conséquent, si nous pouvons connaître les valeurs de P (y = 0) et P (y = 1), il sera réglé.
P (y = 0) peut être interprété comme "la probabilité que certaines données soient sélectionnées et qu'elles portent l'étiquette 0".
Trouver la population P (y = 0) et P (y = 1) n'est pas facile. Par conséquent, supposons que le rapport de composition de l'étiquette des données de l'enseignant soit la valeur estimée de P (y = 0) et P (y = 1). Sur 100 données d'enseignants, 40 sont l'étiquette 0 et 60 sont l'étiquette 1.
P(y=0)=0.4\\ P(y=1)=0.6
Je suppose.
En fait, les classificateurs que j'ai implémentés dans les articles précédents ignoraient les effets de P (y = 0) et P (y = 1). Il a fait une forte supposition que le rapport de chaque étiquette était égal.
Sur la base de l'explication jusqu'à présent, nous implémenterons à nouveau le classificateur orienté objet.
import numpy as np
class GKDEClassifier(object):
def __init__(self, bw_method="scotts_factor", weights="None"):
# Bande passante du noyau
self.bw_method = bw_method
# Poids du noyau
self.weights = weights
def fit(self, X, y):
Nombre d'étiquettes pour # y
self.y_num = len(np.unique(y))
#Calcul du ratio d'étiquette
self.label, y_count = np.unique(y, return_counts=True)
self.y_rate = y_count/y_count.sum()
# Liste contenant les fonctions de densité de probabilité estimée
self.kernel_ = []
# Stocker la fonction de densité de probabilité
for i in range(self.y_num):
kernel = gaussian_kde(X[y==self.label[i]].T)
self.kernel_.append(kernel)
return self
def predict(self, X):
# Liste pour stocker les étiquettes prédictives
pred = []
#Ndarray qui stocke les probabilités des données de test par étiquette
self.p_ = np.empty([self.y_num, len(X)])
# Stocker la probabilité par étiquette
for i in range(self.y_num):
self.p_[i] = self.kernel_[i].evaluate(X.T)
# Multipliez le ratio d'étiquette
for j in range(self.y_num):
self.p_[j] = self.p_[j] * self.y_rate[j]
# Allocation d'étiquettes de prédiction
for k in range(len(X)):
pred.append(self.label[np.argmax(self.p_.T[k])])
return pred
Les pièces ajoutées et modifiées sont expliquées ci-dessous.
self.label, y_count = np.unique(y, return_counts=True)
self.y_rate = y_count/y_count.sum()
Ajout de la partie pour calculer le rapport d'étiquette des données de l'enseignant à la méthode d'ajustement. La valeur totale de y_rate est définie sur 1 en divisant le nombre d'apparitions y_count pour chaque étiquette par la valeur totale. Si vous utilisez y_count tel quel sans diviser par la valeur totale, le résultat ne changera pas.
De plus, la répartition des étiquettes *** (0, 1 ou chaîne de caractères) est sortie sous forme d'étiquette de liste. ***(important)
Voici le nouveau code. Correction pour correspondre à diverses étiquettes.
for i in range(self.y_num):
kernel = gaussian_kde(X[y==self.label[i]].T)
self.kernel_.append(kernel)
C'est le code jusqu'à présent ↓ ↓
kernel = gaussian_kde(X[y==i].T)
À l'origine, "données avec étiquette i" était spécifié, mais il a été modifié pour spécifier "données avec étiquette de type i". En spécifiant à partir de l'étiquette de sortie, cela correspond à une étiquette (chaîne de caractères etc.) qui n'est pas un entier non négatif.
for j in range(self.y_num):
self.p_[j] = self.p_[j] * self.y_rate[j]
Ajout d'une partie à la méthode de prédiction qui multiplie la densité de probabilité par le rapport d'étiquette.
Voici le nouveau code.
for k in range(len(X)):
pred.append(self.label[np.argmax(self.p_.T[k])])
En spécifiant l'étiquette attribuée à partir de l'étiquette de liste, les étiquettes autres que les entiers non négatifs sont également prises en charge.
J'ai réécrit la partie désordonnée de la méthode de prédiction en utilisant numpy. En créant d'abord le ndarray, puis en remplaçant le résultat, nous essayons d'améliorer la lisibilité et la vitesse de calcul.
J'ai réussi à finir d'écrire dans mon cerveau jusqu'au bout. Merci pour votre relation. Nous espérons que ceux qui liront l'article le trouveront encore un peu plus intéressant.
(Corrigé le 5 août 2020)