Наличие AssertionError при использовании кластеризации NLTK KMeans - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь использовать кластер NLTK KMeans для кластеризации некоторых векторов. У меня есть несколько 10-мерных векторов, когда я пытался их кластеризовать, NLTK иногда выдает такие ошибки:

Traceback (most recent call last):
  File "/home/yhz82415/workspace/Grouping/src/Driver.py", line 27, in <module>
    main()
  File "/home/yhz82415/workspace/Grouping/src/Driver.py", line 20, in main
    KMeans(numClusters, dictionary)
  File "/home/yhz82415/workspace/Grouping/src/Tools.py", line 78, in KMeans
    clusters=clusterer.cluster(vectors, True)
  File "/usr/local/lib/python2.7/dist-packages/nltk/cluster/util.py", line 51, in cluster
    self.cluster_vectorspace(vectors, trace)
  File "/usr/local/lib/python2.7/dist-packages/nltk/cluster/kmeans.py", line 70, in cluster_vectorspace
    self._cluster_vectorspace(vectors, trace)
  File "/usr/local/lib/python2.7/dist-packages/nltk/cluster/kmeans.py", line 109, in _cluster_vectorspace
    new_means = map(self._centroid, clusters)
  File "/usr/local/lib/python2.7/dist-packages/nltk/cluster/kmeans.py", line 149, in _centroid
    assert len(cluster) > 0
AssertionError

И ошибка не всегда выходит, иногда появляется, иногда нет.

Я попробовал демонстрационный код, он отлично работает.

У кого-нибудь есть подсказки?

Заранее спасибо

1 Ответ

0 голосов
/ 01 октября 2012

Из того, что я видел в исходном коде (хотя это может быть другая версия nltk), видно, что оператор assert находится в функции _centroid. Назначение этой функции - вычислить центр тяжести кластера. Если у кластера нет точек, вычислять центроид бессмысленно, поэтому самая первая строка _centroid проверяет это условие.

Теперь, если кластер имеет 0 очков, это может означать любое количество вещей в зависимости от того, что вы делаете. Может быть, это условие ошибки, может быть, это означает, что кластер может быть утилизирован, может быть, вы хотите перенаселить этот кластер точками из других кластеров .... что угодно. Так что это то, что пользователь может захотеть узнать, но это не обязательно должно рассматриваться как ошибка, потому что это не обязательно условие ошибки.

Кстати, копия изучаемого мной источника this

...