[PYTHON] Essayez le clustering avec un modèle gaussien mixte sur Jupyter Notebook

La précédente Essayez SVM avec scikit-learn sur Jupyter Notebook C'est un article dont je veux faire suite.

Après ça, Installation et démarrage faciles de Jupyter Notebook à l'aide de Docker (prend également en charge nbextensions et Scala) --Qiita Je suis en train de l'essayer dans l'environnement de Jupyter Notebook préparé selon.

Dans cet environnement Jupyter, vous pouvez accéder au port 8888 avec un navigateur et utiliser Jupyter Notebook. Vous pouvez ouvrir une nouvelle note en suivant Nouveau> Python 3 sur le bouton en haut à droite.

Fichier CSV créé au hasard https://github.com/suzuki-navi/sample-data/blob/master/sample-data-2.csv Je l'utilise aussi.

Confirmation des données

Essayez-le avec 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"])

Ce sont les données.

image.png

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

image.png

Je ne peux pas dire si c'est tout, mais il y a quatre groupes. Je vais organiser les graphiques de dispersion de manière bâclée afin que vous puissiez voir les quatre, mais en résumé, les quatre suivants.

A. Une petite quantité de données dispersées B. Gros morceau de données à proximité du centre C. Un petit morceau de données dans le centre près du centre D. Un très petit morceau de données près du centre et légèrement en haut à droite du centre

Vous trouverez ci-dessous un diagramme de dispersion à code couleur.

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

image.png

Il y a une grande quantité de données près du centre (B vert, C bleu, D violet) et une petite quantité de données dispersées autour (A jaune).

Agrandissons la zone près du centre.

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

image.png

Il y a deux bosses sombres (C bleu, D violet) dans la zone verte.

Développons encore plus.

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

image.png

Le centre est C bleu et le coin supérieur droit est D violet.

Comme vous pouvez le voir en regardant le code ci-dessous qui a généré ces données, nous avons juste superposé quatre couleurs qui ont été distribuées aléatoirement avec une distribution normale pour chaque couleur.

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

Je souhaite regrouper ces 4 couleurs sans professeur.

Essayez K-means

Avant le modèle gaussien mixte, essayez K-means, qui est également un clustering non supervisé. Cela semble impossible avec K-means de la distribution de données, mais essayons de comprendre comment le faire.

Pour le moment

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

Apprenez avec le modèle K-means. Spécifiez que le nombre de clusters est de quatre.

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

référence sklearn.cluster.KMeans — scikit-learn 0.21.3 documentation

Si vous utilisez plotting.plot_decision_regions inclus dans le package mlxtend, vous pouvez visualiser comment il est classé dans un diagramme de dispersion. Vous devez passer un tableau de NumPy à plot_decision_regions au lieu d'un objet Pandas, alors convertissez-le avec la méthode to_numpy ().

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

image.png

Comme vous pouvez le voir, cela n'a pas du tout fonctionné.

référence plot_decision_regions - Mlxtend.plotting - mlxtend pandas.DataFrame.to_numpy — pandas 0.25.3 documentation

Essayez un modèle gaussien mixte

Essayons le modèle gaussien mixte du sujet.

référence 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

Eh bien, pas autant que je m'y attendais ...

Je ne savais pas comment développer avec plot_decision_regions, donc je regarde généralement le centre du résultat de la classification avec matplotlib.

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

image.png

Les deux bosses au centre se sont rapprochées.

Il y a un élément aléatoire dans l'apprentissage, alors je l'ai essayé d'une manière ou d'une autre, mais cela ne sépare pas les deux morceaux au centre, et partout ailleurs, il semble dessiner des limites disjointes.

Logique d'origine (?)

C'est abrupt, mais ici j'ai écrit mon propre code basé sur K-means afin que les clusters qui suivent une distribution normale puissent être séparés.

J'ai écrit mon propre code dans Scala pour le moment, mais je vais omettre les détails ici. Si je peux me le permettre, je le présenterai dans un autre article.

Enregistrez le résultat du clustering avec votre propre code dans pred1.csv et voyez-le dans le diagramme de dispersion.

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

image.png

Cela semble bon.

Agrandir la partie centrale.

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

J'ai pu le séparer proprement en quatre.

Contexte

La motivation de cet article était de vouloir se séparer sans enseignant dans le cas de cet échantillon de données, qui ne peut pas être séparé proprement avec des K-means, mais l'ordre des articles était différent et le modèle gaussien mixte n'était pas clair au début. , J'ai écrit ma propre logique plus tôt. C'est une version améliorée de K-means.

J'ai été impressionné par la séparation nette avec ma propre logique, mais lorsque j'ai consulté @stkdev en pensant que je réinventais juste un algorithme connu, on m'a fait remarquer que cela pouvait être fait avec un modèle gaussien mixte. Je n'ai pas encore entièrement compris l'algorithme du modèle gaussien mixte, et je ne suis pas sûr qu'il soit identique à la logique originale que j'ai écrite. C'est peut-être la même chose, mais au moins je pense que c'est similaire.

Cependant, je ne suis pas sûr qu'il s'agisse d'un problème de réglage qui ne s'est pas clairement manifesté lorsque je l'ai essayé avec un modèle gaussien mixte avec scicit-learn.

Je publierai ma propre logique séparément si je peux me le permettre.

Recommended Posts

Essayez le clustering avec un modèle gaussien mixte sur Jupyter Notebook
Essayez SVM avec scikit-learn sur Jupyter Notebook
Essayez le modèle d'espace d'état (Jupyter Notebook + noyau IR)
[Python] Clustering avec un modèle gaussien infiniment mélangé
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
Faites un son avec le notebook Jupyter
Essayez d'exécuter Jupyter Notebook sur Mac
Faire de Jupyter Notebook un service sur CentOS
Exécuter le notebook Jupyter sur un serveur distant
Essayez TensorFlow RNN avec un modèle de base
Activer Jupyter Notebook avec conda sur un serveur distant
Essayez d'utiliser l'environnement virtuel conda avec Jupyter Notebook
Affichage simple du graphique linéaire sur Jupyter Notebook
Essayez Apache Spark avec Jupyter Notebook (sur Docker local
Essayez les opérations de base sur Pandas DataFrame sur Jupyter Notebook
Dessiner une structure arborescente avec D3.js dans Jupyter Notebook
Approvisionnement EC2 avec Vagrant + Jupyter (IPython Notebook) sur Docker
Utilisation de Graphviz avec Jupyter Notebook
Utiliser pip avec Jupyter Notebook
Essayez de programmer avec un shell!
Essayez d'utiliser Jupyter Notebook de manière dynamique
Graphiques élevés dans le notebook Jupyter
Afficher le PDF sur Jupyter Notebook
Utiliser Cython avec Jupyter Notebook
Jouer avec Jupyter Notebook (IPython Notebook)
Essayez d'exécuter Python avec Try Jupyter
La façon habituelle d'ajouter un noyau avec Jupyter Notebook
Écrivez des graphiques en temps réel avec Matplotlib sur le notebook Jupyter
Un moyen très pratique de présenter avec Jupyter Notebook
Une note lorsque je ne peux pas ouvrir le bloc-notes Jupyter sous Windows
Exécutez Jupyter Notebook sous Windows
Étapes rapides pour créer un environnement d'apprentissage automatique à l'aide de Jupyter Notebook sur macOS Sierra avec anaconda
Comment démarrer par lots un programme Python créé avec le notebook Jupyter
Je voulais créer une présentation intelligente avec Jupyter Notebook + nb present
Créez un environnement d'expérimentation / d'analyse psychologique confortable avec PsychoPy + Jupyter Notebook
Publier Jupyter Notebook en tant que billet de blog
Visualisez l'arbre de décision avec le notebook Jupyter
Utiliser Markdown avec le notebook Jupyter (avec raccourci)
Essayez d'exécuter Jupyter avec VS Code
Ajouter plus de noyaux avec Jupyter Notebook
Analyse pratique avec Pandas + notebook Jupyter
[Python] Modèle gaussien mixte avec Pyro
Créer un itérateur de modèle avec PySide
Essayez de démarrer Jupyter Notebook ~ Formation Esper
Comment configurer un notebook Jupyter à la destination SSH (AWS EC2)
Paramètres de lecture de fichiers S3 avec des pandas depuis Jupyter Notebook sur AWS
Utiliser nbextensions avec le notebook Jupyter d'Anaconda
Utilisation d'Apache Spark avec le notebook Jupyter (notebook IPython)
Faisons un noyau jupyter
Je veux écrire un blog avec Jupyter Notebook
Essayez de dessiner une distribution normale avec matplotlib
Utiliser Jupyter Lab et Jupyter Notebook avec EC2
Créez un pipeline de notebook avec Kedro + Papermill
Un mémo contenant Python2.7 et Python3 dans CentOS
Carte des informations de location sur une carte avec python
Lancer une demande avec un certificat sur httpie
Essayez le chiffrement côté serveur de S3 à l'aide de boto3
Cloner le référentiel github sur le notebook Jupyter
Comment utiliser le notebook Jupyter avec ABCI