[PYTHON] Implementierung und Experiment der konvexen Clustering-Methode

Code, den ich geschrieben habe

Es ist ein kindisches Ergebnis, aber ich habe Code auf Github veröffentlichen durchgeführt.

Verweise

Mein grobes Verständnis

Die konvexe Clustermethode ist eine Clustermethode, bei der die Anzahl der Klassen basierend auf der Parameterschätzung der gemischten Normalverteilung unbekannt ist.

Der Unterschied zur Parameterschätzung der gemischten Normalverteilung (im Folgenden als weiches K-Mittel bezeichnet) durch den üblichen EM-Algorithmus liegt in den Parametern, denen Anfangswerte zugewiesen werden müssen.

Methode Ursprünglicher Wert
soft K-means Anzahl der Normalverteilungen und Durchschnitt jeder Verteilung
Konvexe Clustering-Methode Verteilung der Normalverteilung(Mit allen Distributionen vereinheitlicht)

Daher hat es den Vorteil, weniger vom Anfangswert der Lösung abhängig zu sein als weiche K-Mittel.

Die Wahrscheinlichkeit der von jedem Schwerpunkt gebildeten Normalverteilung wird berechnet, indem alle beobachteten Daten als Schwerpunkte betrachtet werden. Die Wahrscheinlichkeitsberechnung ist nur einmalig und nur die vorherige Wahrscheinlichkeit wird aktualisiert. Mit der Aktualisierung nähert sich die vorherige Wahrscheinlichkeit von Zentroiden, bei denen es schwierig ist, eine Verteilung zu bilden, Null. Selbst wenn es eine bestimmte Vorwahrscheinlichkeit gibt, ist die Anzahl der verbleibenden Zentroide die endgültige Anzahl der Klassen.

Motivation zur Umsetzung

Ich war interessiert, weil es in der Literatur eingeführt wurde [1]. Es ist attraktiv, dass es einfach zu implementieren scheint und weniger vom Anfangswert abhängig zu sein scheint. Als Ansatz zur Herstellung von Spielzeug für mein Hobby erwartete ich, dass es einfacher zu verwenden sein würde als nicht parametrische Buchten.

Implementierung

Implementiert in Python + Numpy. Es wird nur der Implementierungsteil der Parameteraktualisierung der konvexen Clustering-Methode angezeigt.

convex_clustering.py


def calculateLikelihoodCombination(x, sigma, gaussianFunc):
    likelihood = np.empty(0)
    for i1 in x:
        likelihood = np.append(likelihood, gaussianFunc(x, i1, sigma))
    samples = len(x)
    return np.reshape(likelihood, (samples, samples))


def calculatePrior(prePrior, likelihood):
    samples = len(prePrior)
    molecule = (prePrior*likelihood.T).T
    denomin = np.sum(molecule, axis=0) + 1e-10
    return np.sum(molecule/denomin, axis=1)/samples


def runConvexClustering(x, hyperSigma, gaussian, plotter):
    # Pre-calculation of likelihood
    likelihood = calculateLikelihoodCombination(x, hyperSigma, gaussian)
    # Initialize prior probability.
    classNum = len(x)  # Number of samples is used as number of classes.
    firstPrior = 1.0/classNum  # Set non zero value.
    prior = np.repeat(firstPrior, classNum)

    # Update parameters.
    for dummy in range(1000):
        prior = calculatePrior(prior, likelihood)

Es ist so einfach, dass Sie nur Dutzende von Zeilen benötigen. Ich denke, es ist kürzer als der weiche K-Mittel-Code, den ich in der Vergangenheit lokal geschrieben habe.

Experimentelle Bedingungen

Faktor Niveau
Daten \mathbb{R}^{1}(1D Daten)、\mathbb{R}^{2}(2D-Daten)
Anzahl der für die Probenahme verwendeten Normalverteilungen Vier
Anzahl der Proben aus einer Normalverteilung 100 Punkte
Die Größe der Anfangswertdispersion(Vergrößerung) gewöhnlich(×1)Groß(×2), Sehr groß(×10)

Die Gesamtzahl der Proben in einem Experiment beträgt 4 * 100 = 400 Punkte. Die mit der Größe der Anfangswertdispersion verbundene Vergrößerung ist die Vergrößerung von der Standardabweichung der für die Probenahme verwendeten Normalverteilung.

Ergebnis

Die folgende Tabelle zeigt den Status des Clusters. Die vertikale Achse der Tabelle sind die Daten, und die horizontale Achse ist die Größe der Anfangswertstreuung.

gewöhnlich Groß Sehr groß
\mathbb{R}^{1} figure_1.png figure_2.png figure_3.png
\mathbb{R}^{2} figure_4.png figure_5.png figure_6.png

Blau ist die Probe und Grün ist die Form der konvexen Bindung der Normalverteilung, die aus dem Schwerpunkt der Klasse erzeugt wird, der durch das konvexe Clustering-Verfahren erhalten wird.

Darüber hinaus ist die Anzahl der nach dem Schnitt verbleibenden Klassen wie folgt. In ähnlicher Weise ist die vertikale Achse der Tabelle die Daten, und die horizontale Achse ist die Größe der Streuung der Anfangswerte.

gewöhnlich Groß Sehr groß
\mathbb{R}^{1} 46 40 5
\mathbb{R}^{2} 23 11 15

Erwägung

Wenn die Verteilung des Anfangswertes [normal, groß] ist, scheint es, dass er ziemlich gut geclustert ist. Ich bin der Meinung, dass Clustering korrekter ist, wenn es [groß] ist. Bei der Anwendung auf ein echtes Problem ist es möglicherweise besser, eine etwas größere Verteilung als erwartet zu verwenden. Wenn die Varianz des Anfangswertes [sehr groß] ist, werden vier Verteilungen als eine Verteilung zusammengefasst. Dies ist jedoch ein ziemlich selbsterklärendes Ergebnis.

Die Anzahl der Schwerpunkte in den Sekundärdaten liegt näher an der Anzahl der Normalverteilungen (= 4), die zur Erzeugung der Stichprobe verwendet wurden, als in den Primärdaten. Dies wird auch in Lit. [2] erwähnt. Je breiter der zu durchsuchende Raum ist, desto geringer ist die Abhängigkeit vom Anfangswert der konvexen Clustering-Methode. Ich mache mir jedoch ein wenig Sorgen, dass die Anzahl der Zentroide nicht nahe genug an 4 heranreicht, wie in der Literatur [1] [2]. \ # Ich hoffe aufrichtig, dass es kein Fehler in der Implementierung ist.

Zusammenfassung

Was ich über die konvexe Clustering-Methode durch Implementierung und Experimentieren empfunden habe, ist, dass "die Implementierung sehr einfach ist, aber es scheint einige Tricks zu geben, um sie auf tatsächliche Probleme anzuwenden". In der Literatur [1] [2] werden die Vor- und Nachteile in der Diskussion angegeben, und es scheint schwierig zu sein, sie in Abhängigkeit von dem zu behandelnden Problem zu verwenden. Ich denke, es ist eine kostengünstige Clustering-Methode, aber ich möchte genauer prüfen, ob sie als Ansatz für das Problem, das ich lösen möchte, geeignet ist.

Recommended Posts

Implementierung und Experiment der konvexen Clustering-Methode
Clustering-Methode Clustering
Erklärung und Implementierung von SocialFoceModel
[Deep Learning von Grund auf neu] Implementierung der Momentum-Methode und der AdaGrad-Methode
Überprüfung und Implementierung der Videorekonstruktionsmethode mit GRU und Autoencoder
Erläuterung und Implementierung von PRML Kapitel 4
Einführung und Implementierung von JoCoR-Loss (CVPR2020)
Erklärung und Implementierung des ESIM-Algorithmus
Einführung und Implementierung der Aktivierungsfunktion
Einsum Implementierung der Wertiterationsmethode
Erklärung und Implementierung von einfachem Perzeptron
Mathematische Erklärung der Dichotomie- und Trisektionssuch- und Implementierungsmethode ohne Fehler
[Python] Implementierung der Nelder-Mead-Methode und Speichern von GIF-Bildern durch matplotlib
[Empfehlung] Zusammenfassung der Vor- und Nachteile der inhaltsbasierten und kooperativen Filter- / Implementierungsmethode
Erklärung und Implementierung des Decomposable Attention-Algorithmus
Vergleichen Sie die Implementierungsbeispiele für scikit-learn und pyclustering k-means
TRIE-Baumimplementierung mit Python und LOUDS
Implementierung der Gradientenmethode 1
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
Implementierung der Clustering-K-Form-Methode für Zeitreihendaten [Unüberwachtes Lernen mit Python Kapitel 13]
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
Führen Sie die Sortierimplementierung / Berechnungsmengenanalyse zusammen und experimentieren Sie in Python
Implementierung der Bedingung zur Beurteilung der Objektauthentizität unter Verwendung der __bool__- Methode
Sequentielle Aktualisierung der Co-Distribution zur Ableitung und Implementierung von Ausdrücken
Clustering und Hauptkomponentenanalyse nach der K-Means-Methode (Anfänger)
Maschinelles Lernen #k Nachbarschaftsmethode und deren Implementierung und verschiedene
Ich berührte Bachstelze (3). Untersuchung und Implementierung von Popup-Nachrichten.
Implementierung des DB-Administratorbildschirms durch Flask-Admin und Flask-Login
Visualisierung von Daten anhand einer erklärenden Variablen und einer objektiven Variablen
Clustering-Experiment durch Probenahme
Parallelisierung der Klassenmethode
Methodenüberschreibung und super
Implementierung der Fibonacci-Sequenz
Perceptron Grundlagen und Implementierung
Ich habe die Methode des maschinellen Lernens und ihre Implementierungssprache anhand der Tag-Informationen von Qiita betrachtet
Zusammenfassung der Testmethode
Python-Implementierung des CSS3-Mischmodus und Diskussion über den Farbraum
Erhöhen Sie die Geschwindigkeit der Monte-Carlo-Methode zur Implementierung von Cython-Ausschnitten.
Ableitung und Implementierung von Aktualisierungsgleichungen für die nicht negative Tensorfaktorzerlegung
Eine einfache Python-Implementierung der k-Neighborhood-Methode (k-NN)
Untersuchung der Austauschprognosemethode mit Deep Learning und Wavelet-Konvertierung - Teil 2-
Theorie und Implementierung mehrerer Regressionsmodelle - warum Regularisierung erforderlich ist -
Akustische Simulation FDTD-Methode Ableitung und Implementierung der Mur-Absorptionsgrenze
Implementierung der ML-EM-Methode, Querschnittsrekonstruktionsalgorithmus für CT-Scan
Erläuterung der CSV und Implementierungsbeispiel in jeder Programmiersprache