Le calcul du pourcentage de la variance mesure pour k-means?

Sur le Page Wikipedia, un coude de la méthode est décrite pour déterminer le nombre de clusters à k-means. La méthode intégrée de scipy fournit une mise en œuvre, mais je ne suis pas sûr de comprendre comment la distorsion comme ils l'appellent, est calculée.

Plus précisément, si vous graphique le pourcentage de la variance expliquée par
les clusters en fonction du nombre de clusters, la première clusters
ajouter beaucoup d'informations (expliquer une grande partie de la variance), mais à un certain point
le gain marginal chute, donnant un angle dans le graphique.

En supposant que j'ai les points suivants avec leurs centroïdes, ce qui est un bon moyen de calcul de cette mesure?

points = numpy.array([[ 0,  0],
       [ 0,  1],
       [ 0, -1],
       [ 1,  0],
       [-1,  0],
       [ 9,  9],
       [ 9, 10],
       [ 9,  8],
       [10,  9],
       [10,  8]])

kmeans(pp,2)
(array([[9, 8],
   [0, 0]]), 0.9414213562373096)

Que je recherche précisément au calcul de l'0.94.. mesure de simplement les points et les centroïdes. Je ne suis pas sûr si l'un des intégré les méthodes de scipy peut être utilisé ou je dois écrire mon propre. Toutes les suggestions sur la façon de le faire efficacement pour un grand nombre de points?

En bref, mes questions (toutes relatives) sont les suivantes:

  • Donnée d'une matrice de distance et une cartographie de ce qui appartient à quel point
    cluster, ce qui est un bon moyen de calcul d'une mesure qui peut être utilisée
    pour tirer le coude de la parcelle?
  • Comment la méthodologie de changer si une autre fonction de distance tels que la similarité cosinus est utilisée?

EDIT 2: Distorsion

from scipy.spatial.distance import cdist
D = cdist(points, centroids, 'euclidean')
sum(numpy.min(D, axis=1))

La sortie pour le premier ensemble de points de est fidèle. Cependant, quand j'essaye un autre jeu:

>>> pp = numpy.array([[1,2], [2,1], [2,2], [1,3], [6,7], [6,5], [7,8], [8,8]])
>>> kmeans(pp, 2)
(array([[6, 7],
       [1, 2]]), 1.1330618877807475)
>>> centroids = numpy.array([[6,7], [1,2]])
>>> D = cdist(points, centroids, 'euclidean')
>>> sum(numpy.min(D, axis=1))
9.0644951022459797

Je suppose que la dernière valeur ne correspond pas à cause kmeans semble être la plongée de la valeur par le nombre total de points dans le jeu de données.

EDIT 1: Pourcentage de la Variance

Mon code jusqu'à présent (ce qui devrait être ajouté à Denis K-moyens de mise en œuvre):

centres, xtoc, dist = kmeanssample( points, 2, nsample=2,
        delta=kmdelta, maxiter=kmiter, metric=metric, verbose=0 )

print "Unique clusters: ", set(xtoc)
print ""
cluster_vars = []
for cluster in set(xtoc):
    print "Cluster: ", cluster

    truthcondition = ([x == cluster for x in xtoc])
    distances_inside_cluster = (truthcondition * dist)

    indices = [i for i,x in enumerate(truthcondition) if x == True]
    final_distances = [distances_inside_cluster[k] for k in indices]

    print final_distances
    print np.array(final_distances).var()
    cluster_vars.append(np.array(final_distances).var())
    print ""

print "Sum of variances: ", sum(cluster_vars)
print "Total Variance: ", points.var()
print "Percent: ", (100 * sum(cluster_vars) / points.var())

Et voici le résultat pour k=2:

Unique clusters:  set([0, 1])

Cluster:  0
[1.0, 2.0, 0.0, 1.4142135623730951, 1.0]
0.427451660041

Cluster:  1
[0.0, 1.0, 1.0, 1.0, 1.0]
0.16

Sum of variances:  0.587451660041
Total Variance:  21.1475
Percent:  2.77787757437

Sur mon dataset (ne pas regarder à droite pour moi!):

Sum of variances:  0.0188124746402
Total Variance:  0.00313754329764
Percent:  599.592510943
Unique clusters:  set([0, 1, 2, 3])
Sum of variances:  0.0255808508714
Total Variance:  0.00313754329764
Percent:  815.314672809
Unique clusters:  set([0, 1, 2, 3, 4])
Sum of variances:  0.0588210052519
Total Variance:  0.00313754329764
Percent:  1874.74720416
Unique clusters:  set([0, 1, 2, 3, 4, 5])
Sum of variances:  0.0672406353655
Total Variance:  0.00313754329764
Percent:  2143.09824556
Unique clusters:  set([0, 1, 2, 3, 4, 5, 6])
Sum of variances:  0.0646291452839
Total Variance:  0.00313754329764
Percent:  2059.86465055
Unique clusters:  set([0, 1, 2, 3, 4, 5, 6, 7])
Sum of variances:  0.0817517362176
Total Variance:  0.00313754329764
Percent:  2605.5970695
Unique clusters:  set([0, 1, 2, 3, 4, 5, 6, 7, 8])
Sum of variances:  0.0912820650486
Total Variance:  0.00313754329764
Percent:  2909.34837831
Unique clusters:  set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Sum of variances:  0.102119601368
Total Variance:  0.00313754329764
Percent:  3254.76309585
Unique clusters:  set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Sum of variances:  0.125549475536
Total Variance:  0.00313754329764
Percent:  4001.52168834
Unique clusters:  set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
Sum of variances:  0.138469402779
Total Variance:  0.00313754329764
Percent:  4413.30651542
Unique clusters:  set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
  • Je vais essayer de répondre à cette soirée 🙂
  • Merci 🙂
InformationsquelleAutor Legend | 2011-07-11