2011-11-22 21 views
6

Tengo una matriz de números de coma flotante, que está desordenada. Sé que los valores siempre se reducen a unos pocos puntos, que no se conocen. Por ejemplo, esta listaordenar la lista de números de coma flotante en los grupos

[10.01,5.001,4.89,5.1,9.9,10.1,5.05,4.99] 

tiene valores agrupados alrededor de 5 y 10, por lo que me gustaría [5,10] como respuesta.

Me gustaría encontrar esos clusters para listas con más de 1000 valores, donde el nunber de clusters es probablemente alrededor de 10 (para cierta tolerancia dada). ¿Cómo hacer eso de manera eficiente?

Respuesta

13

Comprobar python-cluster

Con esta biblioteca se podría hacer algo como esto:

from cluster import * 

data = [10.01,5.001,4.89,5.1,9.9,10.1,5.05,4.99] 
cl = HierarchicalClustering(data, lambda x,y: abs(x-y)) 
print [mean(cluster) for cluster in cl.getlevel(1.0)] 

Y que se obtendría:

[5.0062, 10.003333333333332] 

(Este es un ejemplo muy tonto, porque Don 'Realmente no sé lo que quiere hacer, y porque esta es la primera vez que uso esta biblioteca)

+0

Un ejemplo de uso corto sería bueno. Ese enlace podría estar desactualizado pronto. –

+0

@Tim Tienes razón, he agregado un pequeño ejemplo –

+0

La documentación del paquete es todo lo que necesitaba para usarla, y funciona muy bien. – eudoxos

2

Puede probar el siguiente método:

Primero ordene la matriz y use diff() para calcular la diferencia entre dos valores continuos. la diferencia más grande que el umbral se puede considerar como la posición de división:

import numpy as np 
x = [10.01,5.001,4.89,5.1,9.9,10.1,5.05,4.99] 
x = np.sort(x) 
th = 0.5 
print [group.mean() for group in np.split(x, np.where(np.diff(x) > th)[0]+1)] 

el resultado es:

[5.0061999999999998, 10.003333333333332] 
Cuestiones relacionadas