¿Cómo trazar la salida de datos de la agrupación?

15

Intenté agrupar un conjunto de datos (un conjunto de marcas) y obtuve 2 grupos. Me gustaría representarlo gráficamente. Poco confundido acerca de la representación, ya que no tengo las coordenadas (x, y).

También buscando la función MATLAB / Python para hacerlo.

EDITAR

Creo que publicar datos aclara la pregunta. Tengo dos grupos que hice usando kmeans en Python (sin usar scipy). Son

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]

Me gustaría trazarlo. Intenté lo siguiente y obtuve el siguiente resultado cuando tracé ay b.

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

ingrese la descripción de la imagen aquí

¿Puedo obtener una mejor visualización de la agrupación?

usuario2721
fuente
1
Eso depende realmente de que ha hecho la agrupación :) Si muestra un pequeño ejemplo de los datos que se han estoy seguro de que obtendrá una respuesta
David W
1
El uso de diferentes colores y marcadores tiende a ser el más simple / fácil de leer. Si todo lo que tiene son 2 grupos, puede imprimir 0/1 u O / X para los diferentes valores.
Marcin
Diga a qué se refiere con "un conjunto de marcas". ¿Cuántas variables tiene para caracterizar los clústeres? Además, ¿está seguro de que 2 es el mejor número de clústeres para usar? Muchas veces uno tiene que usar programas de análisis de clúster de forma iterativa; Al principio, uno podría obtener solo 2, pero con algunos ajustes, se podría obtener un número mayor más interesante e informativo.
rolando2
Solía kmeans donde tengo que dar el número de grupos explícitamente
user2721
@ user2721, ¿podría mostrarnos cómo utiliza kmeans?
Sigur

Respuestas:

30

Por lo general, trazaría los valores originales en un diagrama de dispersión (o una matriz de diagramas de dispersión si tiene muchos de ellos) y usaría el color para mostrar sus grupos.

Solicitó una respuesta en python, y en realidad hace todo el agrupamiento y el trazado con scipy, numpy y matplotlib:

Comience haciendo algunos datos

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

¿Cuántos racimos?

Esto es lo difícil de k-means, y hay muchos métodos. Usemos el método del codo

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

Trama de codo

Asigna tus observaciones a las clases y trazalas

Creo que el índice 3 (es decir, 4 grupos) es tan bueno como cualquier otro

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

gráfico de dispersión

Simplemente averigüe dónde puede incluir lo que ya ha hecho en ese flujo de trabajo (¡y espero que los grupos sean un poco más agradables que los aleatorios!)

david w
fuente
Tu respuesta se ve genial. ¿Puedo usarlo eficientemente para mis datos? No tuve tiempo para probarlo.
usuario2721
@david w: ¡Esta es una de las mejores respuestas que he visto! Muchas gracias por publicar un ejemplo independiente. Al menos, entiendo el quid de tu respuesta :) ¡Gracias una vez más!
Leyenda
@david w: La única pregunta que tuve es que el método del codo muestra valores crecientes y su gráfica muestra una disminución. ¿Es esto porque está utilizando los valores de distorsión directamente de kmeans? ¿Cómo puedo convertir esto para que se vea como el diagrama de codo de Wikipedia? Y como última pregunta, ¿sabrías cómo hacer esto para kmeans2 en lugar de kmeans?
Leyenda
¿Descubriste el índice 3 solo mirando la primera trama?
Sigur
2

Tal vez intente algo como Fastmap para trazar su conjunto de marcas usando sus distancias relativas.

(todavía) nada inteligente ha escrito Fastmap en python para trazar cadenas y podría actualizarse fácilmente para manejar listas de atributos si escribiera su propia métrica de distancia.

A continuación se muestra una distancia euclidiana estándar que uso que toma dos listas de atributos como parámetros. Si sus listas tienen un valor de clase, no lo use en el cálculo de la distancia.

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 carnicero
fuente
0

No soy un experto en python, pero es extremadamente útil trazar los primeros 2 componentes principales entre sí en los ejes x, y.

No estoy seguro de qué paquetes está utilizando, pero aquí hay un enlace de muestra:

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

Ralph Winters
fuente
No soy un experto en estadísticas. ¿Podría explicar más sobre la idea de la trama?
user2721
La idea básica es que muchas variables están correlacionadas entre sí y todo se puede reducir a solo dos variables que no están correlacionadas entre sí y explican "la mayoría" de la variación en los datos. Debe leer el análisis de componentes principales y aplicar un paquete que le permita implementarlo. en.wikipedia.org/wiki/Principal_component_analysis
Ralph Winters