Wie zeichnet man die Datenausgabe des Clusters?


15

Ich habe versucht, eine Reihe von Daten (eine Reihe von Markierungen) zu gruppieren und habe 2 Cluster erhalten. Ich möchte es grafisch darstellen. Etwas verwirrt über die Darstellung, da ich die (x, y) Koordinaten nicht habe.

Suchen Sie auch nach der MATLAB / Python-Funktion, um dies zu tun.

BEARBEITEN

Ich denke, dass das Posten von Daten die Frage klarer macht. Ich habe zwei Cluster, die ich mithilfe von kmeans-Clustering in Python erstellt habe (ohne scipy). Sie sind

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]

Ich würde es gerne planen. Ich habe folgendes versucht und folgendes Ergebnis erhalten, als ich aund plante b.

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

Bildbeschreibung hier eingeben

kann ich Clustering besser visualisieren?


1
Das hängt wirklich davon ab, ob Sie das Clustering durchgeführt haben :) Wenn Sie ein kleines Beispiel der Daten zeigen, die Sie haben, werden Sie sicher eine Antwort bekommen
david w

1
Die Verwendung unterschiedlicher Farben und Markierungen ist in der Regel am einfachsten bzw. am einfachsten zu lesen. Wenn Sie nur 2 Cluster haben, können Sie einfach 0/1 oder O / X für die verschiedenen Werte drucken.
Marcin

Sagen Sie bitte, was Sie mit "einer Reihe von Markierungen" meinen. Wie viele Variablen haben Sie, mit denen Sie die Cluster charakterisieren können? Sind Sie auch sicher, dass 2 die beste Anzahl zu verwendender Cluster ist? Oft muss man Clusteranalyseprogramme iterativ verwenden; Am Anfang könnte man nur 2 bekommen, aber mit einigen Anpassungen könnte man eine interessantere und informativere höhere Zahl bekommen.
Rolando2

Ich habe kmeans verwendet, bei denen ich die Anzahl der Cluster explizit
angeben

@ user2721, kannst du uns zeigen, wie du kmeans verwendest?
Sigur

Antworten:


30

Normalerweise zeichnen Sie die ursprünglichen Werte in einem Streudiagramm (oder einer Matrix von Streudiagrammen, wenn Sie viele davon haben) und verwenden Farbe, um Ihre Gruppen anzuzeigen.

Sie haben in Python nach einer Antwort gefragt, und Sie führen das gesamte Clustering und Plotten mit scipy, numpy und matplotlib aus:

Beginnen Sie mit einigen Daten

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]])

Wie viele Cluster?

Das ist das Schwierige an k-means und es gibt viele Methoden. Verwenden wir die Ellbogenmethode

#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()

Ellenbogen Grundstück

Ordnen Sie Ihre Beobachtungen Klassen zu und zeichnen Sie sie auf

Ich denke, Index 3 (dh 4 Cluster) ist so gut wie jeder andere

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()

Streudiagramm

Überlegen Sie, wo Sie alles, was Sie bereits getan haben, in diesen Workflow einbauen können (und ich hoffe, Sie sind ein bisschen netter als die zufälligen!)


Ihre Antwort sieht gut aus. Kann ich es effizient für meine Daten nutzen? Konnte keine Zeit bekommen, es zu versuchen.
user2721

@ David W: Dies ist eine der besten Antworten, die ich je gesehen habe! Vielen Dank, dass Sie ein eigenständiges Beispiel gepostet haben. Zumindest verstehe ich den Kern Ihrer Antwort :) Nochmals vielen Dank!
Legende

@david w: Die einzige Frage, die ich hatte, ist, dass die Ellbogenmethode steigende Werte anzeigt und Ihr Plot abnehmende. Liegt es daran, dass Sie die Verzerrungswerte direkt von km verwenden? Wie kann ich das so umwandeln, dass es dem Ellbogenplot der Wikipedia ähnelt? Und als letzte Frage, würden Sie zufällig wissen, wie Sie dies für kmeans2 anstelle von kmeans tun können?
Legende

Haben Sie Index 3 entdeckt, indem Sie sich nur die erste Handlung angesehen haben?
Sigur

2

Versuchen Sie vielleicht etwas wie Fastmap , um Ihre Markierungen anhand ihrer relativen Abstände zu zeichnen.

(noch) nichts Kluges hat Fastmap in Python geschrieben, um Zeichenfolgen zu zeichnen, und könnte leicht aktualisiert werden, um Listen von Attributen zu handhaben, wenn Sie Ihre eigene Entfernungsmetrik aufschreiben.

Unten ist eine von mir verwendete euklidische Standarddistanz angegeben, die zwei Listen von Attributen als Parameter verwendet. Wenn Ihre Listen einen Klassenwert haben, verwenden Sie diesen nicht für die Entfernungsberechnung.

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

0

Ich bin kein Python-Experte, aber es ist äußerst hilfreich, die ersten beiden Hauptkomponenten auf den x- und y-Achsen gegeneinander zu zeichnen.

Nicht sicher, welche Pakete Sie verwenden, aber hier ist ein Beispiellink:

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


Ich bin kein Statistikexperte. Könnten Sie bitte mehr über die Plot-Idee erklären?
user2721

Die Grundidee ist, dass viele Variablen miteinander korreliert sind und alles auf nur zwei Variablen reduziert werden kann, die nicht miteinander korreliert sind und "den größten Teil" der Variation in den Daten erklären. Sie müssen sich über die Analyse der Hauptkomponenten informieren und ein Paket anwenden, mit dem Sie es implementieren können. en.wikipedia.org/wiki/Principal_component_analysis
Ralph Winters
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.