2011-11-22 14 views
6

Ho una matrice di numeri in virgola mobile, che non è ordinata. So che i valori cadono sempre attorno a pochi punti, che non sono noti. Per l'illustrazione, questa listaelenco di ordinamento di numeri in virgola mobile nei gruppi

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

ha valori raggruppati intorno 5 e 10, quindi vorrei [5,10] come risposta.

Mi piacerebbe trovare quei cluster per elenchi con 1000+ valori, in cui il numero di cluster è probabilmente di circa 10 (per una certa tolleranza). Come farlo in modo efficiente?

risposta

13

check python-cluster

Con questa libreria si potrebbe fare qualcosa di simile:

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

E si otterrebbe:

[5.0062, 10.003333333333332] 

(questo è un esempio molto stupido, perché io don so davvero cosa vuoi fare, e perché è la prima volta che uso questa libreria)

+0

Un esempio di utilizzo breve sarebbe bello. Quel collegamento potrebbe essere obsoleto a breve. –

+0

@Tim Hai ragione, ho aggiunto un breve esempio –

+0

La documentazione del pacchetto è tutto ciò che mi serviva per usarlo e funziona perfettamente. – eudoxos

2

È possibile provare il seguente metodo:

Ordinare prima la matrice e utilizzare diff() per calcolare la differenza tra due valori continui. la differenza più grande di soglia può essere considerare come la posizione di divisione:

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

il risultato è:

[5.0061999999999998, 10.003333333333332] 
Problemi correlati