Comment tracer la sortie des données du clustering?

15

J'ai essayé de regrouper un ensemble de données (un ensemble de marques) et j'ai obtenu 2 clusters. Je voudrais le représenter graphiquement. Un peu confus au sujet de la représentation, car je n'ai pas les coordonnées (x, y).

Recherche également la fonction MATLAB / Python pour le faire.

ÉDITER

Je pense que l'affichage des données rend la question plus claire. J'ai deux clusters que j'ai créés en utilisant le clustering kmeans en Python (sans utiliser scipy). Elles sont

class 1: a=[3222403552.0, 3222493472.0, 3222491808.0, 3222489152.0, 3222413632.0, 
3222394528.0, 3222414976.0, 3222522768.0, 3222403552.0, 3222498896.0, 3222541408.0, 
3222403552.0, 3222402816.0, 3222588192.0, 3222403552.0, 3222410272.0, 3222394560.0, 
3222402704.0, 3222298192.0, 3222409264.0, 3222414688.0, 3222522512.0, 3222404096.0, 
3222486720.0, 3222403968.0, 3222486368.0, 3222376320.0, 3222522896.0, 3222403552.0, 
3222374480.0, 3222491648.0, 3222543024.0, 3222376848.0, 3222403552.0, 3222591616.0, 
3222376944.0, 3222325568.0, 3222488864.0, 3222548416.0, 3222424176.0, 3222415024.0, 
3222403552.0, 3222407504.0, 3222489584.0, 3222407872.0, 3222402736.0, 3222402032.0, 
3222410208.0, 3222414816.0, 3222523024.0, 3222552656.0, 3222487168.0, 3222403728.0, 
3222319440.0, 3222375840.0, 3222325136.0, 3222311568.0, 3222491984.0, 3222542032.0, 
3222539984.0, 3222522256.0, 3222588336.0, 3222316784.0, 3222488304.0, 3222351360.0, 
3222545536.0, 3222323728.0, 3222413824.0, 3222415120.0, 3222403552.0, 3222514624.0, 
3222408000.0, 3222413856.0, 3222408640.0, 3222377072.0, 3222324304.0, 3222524016.0, 
3222324000.0, 3222489808.0, 3222403552.0, 3223571920.0, 3222522384.0, 3222319712.0, 
3222374512.0, 3222375456.0, 3222489968.0, 3222492752.0, 3222413920.0, 3222394448.0, 
3222403552.0, 3222403552.0, 3222540576.0, 3222407408.0, 3222415072.0, 3222388272.0, 
3222549264.0, 3222325280.0, 3222548208.0, 3222298608.0, 3222413760.0, 3222409408.0, 
3222542528.0, 3222473296.0, 3222428384.0, 3222413696.0, 3222486224.0, 3222361280.0, 
3222522640.0, 3222492080.0, 3222472144.0, 3222376560.0, 3222378736.0, 3222364544.0, 
3222407776.0, 3222359872.0, 3222492928.0, 3222440496.0, 3222499408.0, 3222450272.0, 
3222351904.0, 3222352480.0, 3222413952.0, 3222556416.0, 3222410304.0, 3222399984.0, 
3222494736.0, 3222388288.0, 3222403552.0, 3222323824.0, 3222523616.0, 3222394656.0, 
3222404672.0, 3222405984.0, 3222490432.0, 3222407296.0, 3222394720.0, 3222596624.0, 
3222597520.0, 3222598048.0, 3222403552.0, 3222403552.0, 3222403552.0, 3222324448.0, 
3222408976.0, 3222448160.0, 3222366320.0, 3222489344.0, 3222403552.0, 3222494480.0, 
3222382032.0, 3222450432.0, 3222352000.0, 3222352528.0, 3222414032.0, 3222728448.0, 
3222299456.0, 3222400016.0, 3222495056.0, 3222388848.0, 3222403552.0, 3222487568.0, 
3222523744.0, 3222394624.0, 3222408112.0, 3222406496.0, 3222405616.0, 3222592160.0, 
3222549360.0, 3222438560.0, 3222597024.0, 3222597616.0, 3222598128.0, 3222403552.0, 
3222403552.0, 3222403552.0, 3222499056.0, 3222408512.0, 3222402064.0, 3222368992.0, 
3222511376.0, 3222414624.0, 3222554816.0, 3222494608.0, 3222449792.0, 3222351952.0, 
3222352272.0, 3222394736.0, 3222311856.0, 3222414288.0, 3222402448.0, 3222401056.0, 
3222413568.0, 3222298848.0, 3222297184.0, 3222488000.0, 3222490528.0, 3222394688.0, 
3222408224.0, 3222406672.0, 3222404896.0, 3222443120.0, 3222403552.0, 3222596400.0, 
3222597120.0, 3222597712.0, 3222400896.0, 3222403552.0, 3222403552.0, 3222403552.0, 
3222299200.0, 3222321296.0, 3222364176.0, 3222602208.0, 3222513040.0, 3222414656.0, 
3222564864.0, 3222407904.0, 3222449984.0, 3222352096.0, 3222352432.0, 3222452832.0, 
3222368560.0, 3222414368.0, 3222399376.0, 3222298352.0, 3222573152.0, 3222438080.0, 
3222409168.0, 3222523488.0, 3222394592.0, 3222405136.0, 3222490624.0, 3222406928.0, 
3222407104.0, 3222442464.0, 3222403552.0, 3222596512.0, 3222597216.0, 3222597968.0, 
3222438208.0, 3222403552.0, 3222403552.0, 3222403552.0]

class 2: b=[3498543128.0, 3498542920.0, 3498543252.0, 3498543752.0, 3498544872.0, 
3498544528.0, 3498543024.0, 3498542548.0, 3498542232.0]

Je voudrais le tracer. J'ai essayé ce qui suit et j'ai obtenu le résultat suivant lorsque je trace aet b.

pylab.plot(a,'x')
pylab.plot(b,'o')
pylab.show()

entrez la description de l'image ici

puis-je obtenir une meilleure visualisation du clustering?

user2721
la source
1
Cela dépend vraiment du fait que vous avez fait le clustering :) Si vous montrez un petit exemple des données que vous avez, je suis sûr que vous obtiendrez une réponse
david w
1
L'utilisation de différentes couleurs et marqueurs a tendance à être la plus simple / la plus facile à lire. Si vous n'avez que 2 clusters, vous pouvez simplement imprimer 0/1 ou O / X pour les différentes valeurs.
Marcin
Veuillez dire ce que vous entendez par «un ensemble de marques». Combien de variables avez-vous pour caractériser les clusters? Êtes-vous également convaincu que 2 est le meilleur nombre de clusters à utiliser? Plusieurs fois, il faut utiliser les programmes d'analyse de cluster de manière itérative; au début, on pourrait obtenir seulement 2, mais avec quelques ajustements, on pourrait obtenir un nombre plus intéressant et informatif.
rolando2
J'ai utilisé kmeans où je dois donner le nombre de clusters de manière explicite
user2721
@ user2721, pourriez-vous nous montrer comment utilisez-vous kmeans?
Sigur

Réponses:

30

Habituellement, vous traceriez les valeurs d'origine dans un nuage de points (ou une matrice de nuages ​​de points si vous en avez plusieurs) et utilisiez la couleur pour montrer vos groupes.

Vous avez demandé une réponse en python, et vous effectuez en fait tout le clustering et le traçage avec scipy, numpy et matplotlib:

Commencez par faire quelques données

import numpy as np
from scipy import cluster
from matplotlib import pyplot

np.random.seed(123)
tests = np.reshape( np.random.uniform(0,100,60), (30,2) )
#tests[1:4]
#array([[ 22.68514536,  55.13147691],
#       [ 71.94689698,  42.31064601],
#       [ 98.07641984,  68.48297386]])

Combien de clusters?

C'est la chose difficile à propos de k-means, et il existe de nombreuses méthodes. Utilisons la méthode du coude

#plot variance for each value for 'k' between 1,10
initial = [cluster.vq.kmeans(tests,i) for i in range(1,10)]
pyplot.plot([var for (cent,var) in initial])
pyplot.show()

Tracé du coude

Attribuez vos observations aux classes et tracez-les

Je pense que l'indice 3 (c'est-à-dire 4 grappes) est aussi bon que tout

cent, var = initial[3]
#use vq() to get as assignment for each obs.
assignment,cdist = cluster.vq.vq(tests,cent)
pyplot.scatter(tests[:,0], tests[:,1], c=assignment)
pyplot.show()

nuage de points

Déterminez simplement où vous pouvez coller tout ce que vous avez déjà fait dans ce flux de travail (et j'espère que vos clusters sont un peu plus agréables que les clusters aléatoires!)

david w
la source
Votre réponse est superbe. Puis-je l'utiliser efficacement pour mes données. Je n'ai pas eu le temps de l'essayer.
user2721
@david w: C'est l'une des meilleures réponses que j'ai vues! Merci beaucoup d'avoir publié un exemple autonome. Au moins, je comprends l'essentiel de votre réponse :) Merci encore!
Legend
@david w: La seule question que j'ai eue est que la méthode du coude montre des valeurs croissantes et votre graphique montre une diminution. Est-ce parce que vous utilisez les valeurs de distorsion directement à partir de kmeans? Comment puis-je convertir cela pour ressembler à l'intrigue du coude de Wikipedia? Et comme dernière question, sauriez-vous comment faire cela pour kmeans2 au lieu de kmeans?
Legend
Avez-vous découvert index 3 juste en regardant la première parcelle?
Sigur
2

Essayez peut-être quelque chose comme Fastmap pour tracer votre ensemble de repères en utilisant leurs distances relatives.

(encore) rien d'intelligent n'a écrit Fastmap en python pour tracer des chaînes et pourrait être facilement mis à jour pour gérer les listes d'attributs si vous avez rédigé votre propre métrique de distance.

Voici une distance euclidienne standard que j'utilise qui prend deux listes d'attributs comme paramètres. Si vos listes ont une valeur de classe, ne l'utilisez pas dans le calcul de la distance.

def distance(vecone, vectwo, d=0.0):
    for i in range(len(vecone)):
        if isnumeric(vecone[i]):
            d = d + (vecone[i] - vectwo[i])**2
        elif vecone[i] is not vectwo[i]:
            d += 1.0
    return math.sqrt(d)

def isnumeric(s):
    try:
        float(s)
        return True
    except ValueError:
        return False
un boucher
la source
0

Je ne suis pas un expert en python, mais il est extrêmement utile de tracer les 2 premiers composants principaux les uns contre les autres sur les axes x, y.

Vous ne savez pas quels packages vous utilisez, mais voici un exemple de lien:

http://pyrorobotics.org/?page=PyroModuleAnalysis

Ralph Winters
la source
Je ne suis pas un expert en statistiques. Pourriez-vous s'il vous plaît expliquer plus sur l'idée de complot?
user2721
L'idée de base est que de nombreuses variables sont corrélées les unes aux autres et que tout peut être réduit à seulement deux variables qui ne sont pas corrélées entre elles et expliquent "la plupart" de la variation des données. Vous devez lire l'analyse des principaux composants et appliquer un package qui vous permet de l'implémenter. en.wikipedia.org/wiki/Principal_component_analysis
Ralph Winters