2010-03-30 5 views
6

1) J'utilise le module hcluster de scipy. Donc la variable sur laquelle j'ai le contrôle est la variable de seuil. Comment connaître ma performance par seuil? c'est-à-dire, dans Kmeans, cette performance sera la somme de tous les points de leurs centroïdes. Bien sûr, cela doit être ajusté car plus de clusters = moins de distance en général.Scipy.cluster.hierarchy.fclusterdata + mesure de distance

Existe-t-il une observation que je peux faire avec hcluster pour cela?

2) Je suis conscient (e) qu'il y a des tonnes de mesures disponibles pour fclusterdata. Je regroupe des documents texte basés sur tf-idf de termes clés. L'affaire est, certains documents sont plus longs que d'autres, et je pense que le cosinus est un bon moyen de "normaliser" cette longueur car plus un document est long, sa "direction" dans un champ n-dimensionnel DEVRAIT rester le même le contenu est cohérent. Y a-t-il d'autres méthodes que quelqu'un peut suggérer? Comment puis-je évaluer?

Thx

Répondre

5

On peut calculer les distances moyennes | x - centre du cluster | pour x dans le cluster, tout comme pour K-means. Ce qui suit fait cette force brute. (Ce doit être un intégré dans scipy.cluster ou scipy.spatial.distance mais je ne peux pas le trouver non plus.)

Sur votre question 2, passez. Tous les liens vers de bons tutoriels sur la classification hiérarchique seraient les bienvenus.

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