[PYTHON] Versuchen Sie, mit einem gemischten Gaußschen Modell auf Jupyter Notebook zu gruppieren

Der Vorherige Probieren Sie SVM mit scikit-learn auf Jupyter Notebook aus Dies ist ein Artikel, den ich fortsetzen möchte.

Danach, Einfache Installation und Inbetriebnahme von Jupyter Notebook mit Docker (unterstützt auch nbextensions und Scala) --Qiita Ich versuche es in der Umgebung von Jupyter Notebook vorbereitet nach.

In dieser Jupyter-Umgebung können Sie mit einem Browser auf Port 8888 zugreifen und das Jupyter-Notizbuch verwenden. Sie können eine neue Notiz öffnen, indem Sie oben rechts auf Neu> Python 3 klicken.

CSV-Datei zufällig erstellt https://github.com/suzuki-navi/sample-data/blob/master/sample-data-2.csv Ich benutze es auch.

Datenbestätigung

Versuchen Sie es mit sample-data-2.csv.

import pandas as pd
from sklearn import model_selection
df = pd.read_csv("sample-data-2.csv", names=["id", "target", "data1", "data2"])

Dies sind die Daten.

image.png

%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(df["data1"], df["data2"])

image.png

Ich kann nicht sagen, ob das alles ist, aber es gibt vier Cluster. Danach werde ich die Streudiagramme schlampig anordnen, so dass Sie die vier sehen können, aber zusammenfassend die folgenden vier.

A. Eine kleine Datenmenge ist verstreut B. Großer Datenblock in der Nähe des Zentrums C. Ein kleiner Datenblock in der Nähe des Zentrums D. Ein sehr kleiner Datenblock in der Nähe der Mitte und etwas rechts oben in der Mitte

Unten sehen Sie ein farbcodiertes Streudiagramm.

plt.scatter(df["data1"], df["data2"], c = df["target"])

image.png

In der Nähe des Zentrums befindet sich eine große Datenmenge (B grün, C blau, D lila) und eine kleine Datenmenge verteilt (A gelb).

Vergrößern wir den Bereich nahe der Mitte.

plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(df["data1"], df["data2"], c = df["target"])

image.png

Im grünen Bereich befinden sich zwei dunkle Klumpen (C blau, D lila).

Lassen Sie es uns noch weiter ausbauen.

plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.scatter(df["data1"], df["data2"], c = df["target"])

image.png

Die Mitte ist C blau und oben rechts ist D lila.

Wie Sie anhand des Codes unten sehen können, der diese Daten generiert hat, haben wir nur vier Farben überlagert, die zufällig mit einer Normalverteilung für jede Farbe verteilt wurden.

https://github.com/suzuki-navi/sample-data/blob/master/sample-data-2.py

Ich möchte diese 4 Farben ohne Lehrer gruppieren.

Versuchen Sie K-Mittel

Versuchen Sie vor dem gemischten Gaußschen Modell K-means, bei dem es sich ebenfalls um unbeaufsichtigtes Clustering handelt. Mit K-means scheint es unmöglich, Daten zu verteilen, aber versuchen wir zu verstehen, wie es geht.

Vorerst

feature = df[["data1", "data2"]]
target = df["target"]

Lernen Sie mit dem K-means-Modell. Geben Sie an, dass die Anzahl der Cluster vier beträgt.

from sklearn import cluster
model = cluster.KMeans(n_clusters=4)
model.fit(feature)

Referenz sklearn.cluster.KMeans — scikit-learn 0.21.3 documentation

Wenn Sie "plotting.plot_decision_regions" verwenden, das im Paket "mlxtend" enthalten ist, können Sie visualisieren, wie es in einem Streudiagramm klassifiziert ist. Sie müssen ein Array von NumPy anstelle eines Pandas-Objekts an plot_decision_regions übergeben, also konvertieren Sie es mit der Methode to_numpy ().

from mlxtend import plotting
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)

image.png

Wie Sie sehen, hat es überhaupt nicht funktioniert.

Referenz plot_decision_regions - Mlxtend.plotting - mlxtend pandas.DataFrame.to_numpy — pandas 0.25.3 documentation

Versuchen Sie es mit einem gemischten Gaußschen Modell

Versuchen wir das gemischte Gaußsche Modell des Subjekts.

Referenz sklearn.mixture.GaussianMixture — scikit-learn 0.21.3 documentation

from sklearn.mixture import GaussianMixture
model = GaussianMixture(n_components=4, covariance_type='full')
model.fit(feature)
plotting.plot_decision_regions(feature.to_numpy(), target.to_numpy(), clf=model)

image.png

Nun, nicht so viel wie ich erwartet hatte ...

Ich wusste nicht, wie ich mit plot_decision_regions expandieren sollte, daher schaue ich normalerweise mit matplotlib in die Mitte des Klassifizierungsergebnisses.

pred = model.predict(feature)
plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(feature["data1"], df["data2"], c = pred)

image.png

Die beiden Klumpen in der Mitte sind zusammengekommen.

Es gibt ein zufälliges Element im Lernen, also habe ich es irgendwie versucht, aber es trennt die beiden Stücke in der Mitte nicht und überall scheint es eine unzusammenhängende Grenze zu ziehen.

Ursprüngliche (?) Logik

Es ist abrupt, aber hier habe ich meinen eigenen Code basierend auf K-Mitteln geschrieben, damit Cluster, die einer Normalverteilung folgen, getrennt werden können.

Ich habe vorerst meinen eigenen Code in Scala geschrieben, aber ich werde die Details hier weglassen. Wenn ich es mir leisten kann, werde ich es in einem anderen Artikel vorstellen.

Speichern Sie das Ergebnis des Clusters mit Ihrem eigenen Code in pred1.csv und sehen Sie es im Streudiagramm.

pred1 = pd.read_csv("pred1.csv", names=["pred"])
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])

image.png

Sieht gut aus.

Vergrößern Sie den zentralen Teil.

plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])

image.png

plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.scatter(feature["data1"], feature["data2"], c = pred1["pred"])

image.png

Ich konnte es sauber in vier Teile teilen.

Hintergrund

Die Motivation für diesen Artikel war, bei diesen Beispieldaten, die mit K-Mitteln nicht sauber getrennt werden können, ohne Lehrer trennen zu wollen, aber die Reihenfolge der Artikel war unterschiedlich, und das gemischte Gaußsche Modell war zunächst nicht klar. Ich habe früher meine eigene Logik geschrieben. Es ist eine verbesserte Version von K-means.

Ich war beeindruckt, dass es möglich war, es mit seiner eigenen Logik so sauber zu trennen, aber als ich mich mit @stkdev beriet und dachte, es sei nur eine Neuerfindung eines bekannten Algorithmus, wurde darauf hingewiesen, dass dies mit einem gemischten Gaußschen Modell möglich ist. Ich habe den Algorithmus des gemischten Gaußschen Modells noch nicht vollständig verstanden und bin mir nicht sicher, ob er mit der ursprünglichen Logik übereinstimmt, die ich geschrieben habe. Es mag dasselbe sein, aber zumindest denke ich, dass es ähnlich ist.

Ich bin mir jedoch nicht sicher, ob es sich um ein Abstimmungsproblem handelt, das nicht sauber herauskam, als ich es mit einem gemischten Gaußschen Modell mit scicit-learn ausprobierte.

Ich werde meine eigene Logik separat veröffentlichen, wenn ich es mir leisten kann.

Recommended Posts

Versuchen Sie, mit einem gemischten Gaußschen Modell auf Jupyter Notebook zu gruppieren
Probieren Sie SVM mit scikit-learn auf Jupyter Notebook aus
Probieren Sie das Zustandsraummodell aus (Jupyter Notebook + IR-Kernel).
[Python] Clustering mit einem unendlich gemischten Gaußschen Modell
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
Machen Sie einen Sound mit Jupyter Notebook
Versuchen Sie, Jupyter Notebook auf einem Mac auszuführen
Machen Sie Jupyter Notebook zu einem Dienst unter CentOS
Führen Sie Jupyter Notebook auf einem Remote-Server aus
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Aktivieren Sie Jupyter Notebook mit conda auf dem Remote-Server
Versuchen Sie, die virtuelle Umgebung von conda mit Jupyter Notebook zu verwenden
Einfache Anzeige des Liniendiagramms auf dem Jupyter Notebook
Probieren Sie Apache Spark mit Jupyter Notebook (auf Local Docker) aus
Probieren Sie grundlegende Operationen mit Pandas DataFrame auf Jupyter Notebook aus
Zeichnen einer Baumstruktur mit D3.js in Jupyter Notebook
EC2-Bereitstellung mit Vagrant + Jupyter (IPython Notebook) auf Docker
Verwenden von Graphviz mit Jupyter Notebook
Verwenden Sie pip mit Jupyter Notebook
Versuchen Sie, mit einer Shell zu programmieren!
Versuchen Sie, Jupyter Notebook dynamisch zu verwenden
Hohe Charts im Jupyter-Notizbuch
PDF auf Jupyter Notebook anzeigen
Verwenden Sie Cython mit Jupyter Notebook
Spielen Sie mit Jupyter Notebook (IPython Notebook)
Versuchen Sie, Python mit Try Jupyter auszuführen
Die übliche Art, einen Kernel mit Jupyter Notebook hinzuzufügen
Schreiben Sie Diagramme in Echtzeit mit Matplotlib auf dem Jupyter-Notizbuch
Eine sehr bequeme Möglichkeit, mit Jupyter Notebook zu präsentieren
Ein Hinweis, wenn ich das Jupyter-Notizbuch unter Windows nicht öffnen kann
Führen Sie Jupyter Notebook unter Windows aus
Schnelle Schritte zum Erstellen einer maschinellen Lernumgebung mit Jupyter Notebook unter macOS Sierra mit anaconda
Starten eines mit Jupyter Notebook erstellten Python-Programms
Ich wollte eine intelligente Präsentation mit Jupyter Notebook + nb present erstellen
Erstellen Sie mit PsychoPy + Jupyter Notebook eine komfortable Umgebung für psychologische Experimente / Analysen
Post Jupyter Notebook als Blog-Beitrag
Visualisieren Sie den Entscheidungsbaum mit einem Jupyter-Notizbuch
Markdown mit Jupyter-Notebook verwenden (mit Verknüpfung)
Versuchen Sie, Jupyter mit VS-Code auszuführen
Fügen Sie mit Jupyter Notebook weitere Kernel hinzu
Bequeme Analyse mit Pandas + Jupyter Notebook
[Python] Gemischtes Gaußsches Modell mit Pyro
Erstellen Sie mit PySide einen Modelliterator
Starten Sie das Jupyter Notebook ~ Esper-Training
So richten Sie ein Jupyter-Notebook am SSH-Ziel ein (AWS EC2)
Einstellungen zum Lesen von S3-Dateien mit Pandas aus Jupyter Notebook unter AWS
Verwenden Sie nbextensions mit Anacondas Jupyter-Notizbuch
Verwenden von Apache Spark mit Jupyter Notebook (IPython Notebook)
Machen wir einen Jupyter-Kernel
Ich möchte einen Blog mit Jupyter Notebook schreiben
Versuchen Sie, mit matplotlib eine Normalverteilung zu zeichnen
Verwenden Sie Jupyter Lab und Jupyter Notebook mit EC2
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Ein Memo mit Python2.7 und Python3 in CentOS
Kartenmietinformationen auf einer Karte mit Python
Werfen Sie eine Anfrage mit einem Zertifikat auf httpie
Versuchen Sie die serverseitige Verschlüsselung von S3 mit boto3
Klonen Sie das Github-Repository auf dem Jupyter-Notizbuch
Verwendung des Jupyter-Notebooks mit ABCI