2010-03-30 15 views
6

1) Sto usando il modulo hunter di Scipy.Scipy.cluster.hierarchy.fclusterdata + distance measure

quindi la variabile su cui ho il controllo è la variabile di soglia. Come faccio a sapere le mie prestazioni per soglia? Ad esempio, in Kmean, questa performance sarà la somma di tutti i punti ai loro centroidi. Ovviamente, questo deve essere aggiustato in quanto più cluster = meno distanza in generale.

C'è un'osservazione che posso fare con hcluster per questo?

2) Mi rendo conto che ci sono tonnellate di metriche disponibili per i dati del fcluster. Sto raggruppando i documenti di testo basati su tf-idf dei termini chiave. L'accordo è, alcuni documenti sono più lunghi di altri, e penso che il coseno sia un buon modo per "normalizzare" questo problema di lunghezza perché più un documento è lungo, la sua "direzione" in un campo n-dimensionale DOVREBBE rimanere lo stesso se il contenuto è coerente. Ci sono altri metodi che qualcuno può suggerire? Come posso valutare?

Thx

risposta

5

Uno può calcolare le distanze medie | x - centro del cluster | per x in cluster, proprio come per K-means. Quanto segue fa questa forza bruta. (Deve essere un integrato in scipy.cluster o scipy.spatial.distance ma non riesco a trovarlo neanche.)

Sulla domanda 2, passare. Sarebbe gradito qualsiasi link a buone esercitazioni sul clustering gerarchico.

alt text

#!/usr/bin/env python 
""" cluster cities: pdist linkage fcluster plot 
    util: clusters() avdist() 
""" 

from __future__ import division 
import sys 
import numpy as np 
import scipy.cluster.hierarchy as hier # $scipy/cluster/hierarchy.py 
import scipy.spatial.distance as dist 
import pylab as pl 
from citiesin import citiesin # 1000 US cities 

__date__ = "27may 2010 denis" 

def clusterlists(T): 
    """ T = hier.fcluster(Z, t) e.g. [a b a b a c] 
     -> [ [0 2 4] [1 3] [5] ] sorted by len 
    """ 
    clists = [ [] for j in range(max(T) + 1)] 
    for j, c in enumerate(T): 
     clists[c].append(j) 
    clists.sort(key=len, reverse=True) 
    return clists[:-1] # clip the [] 

def avdist(X, to=None): 
    """ av dist X vecs to "to", None: mean(X) """ 
    if to is None: 
     to = np.mean(X, axis=0) 
    return np.mean(dist.cdist(X, [to])) 

#............................................................................... 
Ndata = 100 
method = "average" 
t = 0 
crit = "maxclust" 
    # 'maxclust': Finds a minimum threshold `r` so that the cophenetic distance 
    # between any two original observations in the same flat cluster 
    # is no more than `r` and no more than `t` flat clusters are formed. 
    # but t affects cluster sizes only weakly ? 
    # t 25: [10, 9, 8, 7, 6 
    # t 20: [12, 11, 10, 9, 7 
plot = 0 
seed = 1 

exec "\n".join(sys.argv[1:]) # Ndata= t= ... 
np.random.seed(seed) 
np.set_printoptions(2, threshold=100, edgeitems=10, suppress=True) # .2f 
me = __file__.split('/') [-1] 

    # biggest US cities -- 
cities = np.array(citiesin(n=Ndata)[0]) # N,2 

if t == 0: t = Ndata // 4 

#............................................................................... 
print "# %s Ndata=%d t=%d method=%s crit=%s " % (me, Ndata, t, method, crit) 

Y = dist.pdist(cities) # n*(n-1)/2 
Z = hier.linkage(Y, method) # n-1 
T = hier.fcluster(Z, t, criterion=crit) # n 

clusters = clusterlists(T) 
print "cluster sizes:", map(len, clusters) 
print "# average distance to centre in the biggest clusters:" 
for c in clusters: 
    if len(c) < len(clusters[0]) // 3: break 
    cit = cities[c].T 
    print "%.2g %s" % (avdist(cit.T), cit) 
    if plot: 
     pl.plot(cit[0], cit[1]) 

if plot: 
    pl.title("scipy.cluster.hierarchy of %d US cities, %s t=%d" % (
     Ndata, crit, t)) 
    pl.grid(False) 
    if plot >= 2: 
     pl.savefig("cities-%d-%d.png" % (Ndata, t), dpi=80) 
    pl.show() 
Problemi correlati