Dieser Artikel wurde von Anfängern des maschinellen Lernens verfasst. Bitte beachten Sie.
Der erste Artikel ist hier. Der zweite Artikel ist hier.
In diesem Artikel werde ich den Hintergrund der Idee anhand mathematischer Formeln erläutern.
Die Kerndichteschätzung bestand darin, die Wahrscheinlichkeitsdichtefunktion mit der Kernelfunktion zu schätzen. Was genau ist die Wahrscheinlichkeitsdichtefunktion?
Die Wahrscheinlichkeitsdichtefunktion repräsentiert die Verteilung der Zugänglichkeit ***. *** Für Ereignis A bedeutet ein Wert x mit einer hohen Wahrscheinlichkeitsdichte ***, dass beim Auftreten von Ereignis A die Wahrscheinlichkeit, dass der Wert zu diesem Zeitpunkt x ist, relativ hoch ist ***. Ersetzen wir "Ereignis A" durch "Label 0". "Bei Wert x ist die Wahrscheinlichkeitsdichte von Label 0 hoch" bedeutet "wenn einige Daten Label 0 sind, ist die Wahrscheinlichkeit, dass die Daten Wert x sind, relativ hoch".
Es ist hier zu beachten, dass Wahrscheinlichkeitsdichte ≠ Wahrscheinlichkeit. Die Wahrscheinlichkeitsdichte ist "relative Leichtigkeit des Auftretens für ein bestimmtes Ereignis", und es gibt keine Garantie dafür, dass sie mit der Wahrscheinlichkeitsdichte anderer Ereignisse verglichen werden kann. Erstens ist die Wahrscheinlichkeit, dass ein bestimmter Wert in fortlaufenden Daten erscheint, nicht definiert. Die Wahrscheinlichkeit kann ohne einen bestimmten Bereich nicht berechnet werden.
P(X=x)=0 \\ P(X \leqq x)=p
Durch Integrieren der Wahrscheinlichkeitsdichtefunktion kann die Wahrscheinlichkeit in diesem Intervall (oder Bereich, wenn es zwei oder mehr Dimensionen sind) erhalten werden. So kann wahrscheinlich die Wahrscheinlichkeit eines bestimmten Wertes "nahe" berechnet werden. Je höher die Wahrscheinlichkeitsdichte des Wertes x ist, desto höher ist die Wahrscheinlichkeit, dass der Wert x "nahe" erscheint, und je niedriger die Wahrscheinlichkeitsdichte des Wertes x ist, desto geringer ist die Wahrscheinlichkeit, dass der Wert x "nahe" erscheint.
Ich möchte Ihnen ein Beispiel geben. Beim Wert x ist die Wahrscheinlichkeitsdichte von Label 1 höher als die Wahrscheinlichkeitsdichte von Label 0. In diesem Moment,
Welches ist höher? Es ist nicht genau, aber intuitiv scheint letzteres höher zu sein (Verschiedenes). In Zukunft werden wir mit Diskussionen fortfahren, vorausgesetzt, diese Intuition ist korrekt.
Schreiben Sie "label 0" als "y = 0" und "label 1" als "y = 1" um. Dann die Geschichte bisher
Wahrscheinlichkeitsdichte von Label 0 bei Wert x \ leqq Wahrscheinlichkeitsdichte von Label 1 bei Wert x \\
\ Rightarrow Wahrscheinlichkeit des Wertes x bei y = 0 \ leqq Wahrscheinlichkeit des Wertes x bei y = 1 \\
\Rightarrow P(x|y=0) \leqq P(x|y=1)
Es ist zusammengefasst als. Es ist jedoch genau der Wert x "nahe".
Für den Wert x
P(y=0|x) \leqq P(y=1|x)
Wenn ja, ist es sinnvoll, Etikett 1 anstelle von Etikett 0 zuzuweisen. Wenn Sie also die Wahrscheinlichkeit von "Label 0 oder Label 1" und die bedingte Wahrscheinlichkeit unter der Bedingung "Extrahieren des Werts x" finden, werden Sie gewinnen.
Schreiben wir diese Ungleichung mit dem Satz von Bayes um.
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)}
Der Nenner P (x) ist gemeinsam und größer oder gleich 0. Nach alldem
P(x|y=0)P(y=0) \leqq P(x|y=1)P(y=1)
Wenn du zeigen kannst
P(y=0|x) \leqq P(y=1|x)
Kann gesagt werden zu halten. Jetzt mit Kernel-Dichteschätzung
P(x|y=0) \leqq P(x|y=1)
Ich weiß das. Wenn wir also die Werte von P (y = 0) und P (y = 1) kennen, wird es abgerechnet.
P (y = 0) kann interpretiert werden als "die Wahrscheinlichkeit, dass einige Daten ausgewählt sind und die Bezeichnung 0 haben".
Es ist nicht einfach, die Population P (y = 0) und P (y = 1) zu finden. Daher sei das Zusammensetzungsverhältnis des Etiketts der Lehrerdaten der geschätzte Wert von P (y = 0) und P (y = 1). Von 100 Lehrerdaten sind 40 Label 0 und 60 Label 1.
P(y=0)=0.4\\ P(y=1)=0.6
Ich nehme an.
Tatsächlich haben die Klassifizierer, die ich in früheren Artikeln implementiert habe, die Auswirkungen von P (y = 0) und P (y = 1) ignoriert. Er ging stark davon aus, dass das Verhältnis jedes Etiketts gleich war.
Basierend auf der bisherigen Erklärung werden wir den objektorientierten Klassifikator erneut implementieren.
import numpy as np
class GKDEClassifier(object):
def __init__(self, bw_method="scotts_factor", weights="None"):
# Kernelbandbreite
self.bw_method = bw_method
# Kerngewicht
self.weights = weights
def fit(self, X, y):
Anzahl der Etiketten für # y
self.y_num = len(np.unique(y))
# Berechnung des Etikettenverhältnisses
self.label, y_count = np.unique(y, return_counts=True)
self.y_rate = y_count/y_count.sum()
# Liste mit geschätzten Wahrscheinlichkeitsdichtefunktionen
self.kernel_ = []
# Speichern Sie die Wahrscheinlichkeitsdichtefunktion
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 zum Speichern von Vorhersageetiketten
pred = []
#Ndarray, das die Wahrscheinlichkeit von Testdaten nach Label speichert
self.p_ = np.empty([self.y_num, len(X)])
# Speichern Sie die Wahrscheinlichkeit nach Etikett
for i in range(self.y_num):
self.p_[i] = self.kernel_[i].evaluate(X.T)
# Multiplizieren Sie das Etikettenverhältnis
for j in range(self.y_num):
self.p_[j] = self.p_[j] * self.y_rate[j]
# Zuweisung von Vorhersageetiketten
for k in range(len(X)):
pred.append(self.label[np.argmax(self.p_.T[k])])
return pred
Die hinzugefügten und geänderten Teile werden unten erläutert.
self.label, y_count = np.unique(y, return_counts=True)
self.y_rate = y_count/y_count.sum()
Der Teil zur Berechnung des Beschriftungsverhältnisses von Lehrerdaten zur Anpassungsmethode wurde hinzugefügt. Der Gesamtwert von y_rate wird auf 1 gesetzt, indem die Anzahl der Auftritte von y_count für jedes Etikett durch den Gesamtwert dividiert wird. Wenn Sie y_count unverändert verwenden, ohne durch den Gesamtwert zu dividieren, ändert sich das Ergebnis nicht.
Darüber hinaus wird die Aufteilung von *** Beschriftungen (0, 1 oder Zeichenkette) als Listenbeschriftung ausgegeben. ***(wichtig)
Hier ist der neue Code. Behoben, um verschiedenen Beschriftungen zu entsprechen.
for i in range(self.y_num):
kernel = gaussian_kde(X[y==self.label[i]].T)
self.kernel_.append(kernel)
Dies ist der bisherige Code ↓ ↓
kernel = gaussian_kde(X[y==i].T)
Ursprünglich wurde "Daten mit Label i" angegeben, aber es wurde geändert, um "Daten mit Label vom Typ i" anzugeben. Durch Angabe in der Ausgabebezeichnung entspricht dies einer Bezeichnung (Zeichenfolge usw.), die keine nicht negative Ganzzahl ist.
for j in range(self.y_num):
self.p_[j] = self.p_[j] * self.y_rate[j]
Der Vorhersagemethode wurde ein Teil hinzugefügt, der die Wahrscheinlichkeitsdichte mit dem Beschriftungsverhältnis multipliziert.
Hier ist der neue Code.
for k in range(len(X)):
pred.append(self.label[np.argmax(self.p_.T[k])])
Durch Angabe der zugewiesenen Bezeichnung aus der Listenbezeichnung werden auch andere Bezeichnungen als nicht negative Ganzzahlen unterstützt.
Ich habe den chaotischen Teil der Vorhersagemethode mit numpy umgeschrieben. Indem wir zuerst das ndarray erstellen und dann das Ergebnis ersetzen, versuchen wir, die Lesbarkeit und die Berechnungsgeschwindigkeit zu verbessern.
Ich habe es geschafft, das Schreiben in meinem Gehirn bis zum Ende zu beenden. Vielen Dank für Ihre Beziehung. Wir hoffen, dass diejenigen, die den Artikel lesen, ihn noch ein wenig interessanter finden.
(Korrigiert am 5. August 2020)
Recommended Posts