加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

python学习(五)--kmeans聚类的bugFree

(2014-08-13 08:07:25)
标签:

股票

最近,使用nltk中的kmeans聚类方法,具体代码如下:
转化numpy的array:
numpy_matrix = None
numpy_matrix = [numpy.array(matutils.sparse2full(doc,len(dictionary))) for doc in corpus]
for i in range(8,31):
    clusterer = KMeansClusterer(i,euclidean_distance,repeats=10)
    clusters = clusterer.cluster(numpy_matrix, True, trace=True)
    cost = costFunction(numpy_matrix,clusters,clusterer._means)
    clusterNum_cost.append([i,cost])
    clusters_list.append([i,clusters])

但执行过程中总是报这样的问题:
Error: no centroid defined for empty cluster.
Try setting argument 'avoid_empty_clusters' to True

Traceback (most recent call last):
  File "", line 3, in
    clusters = clusterer.cluster(numpy_matrix, True, trace=True)
  File "C:\Python27\lib\site-packages\nltk\cluster\util.py", line 57, in cluster
    self.cluster_vectorspace(vectors, trace)
  File "C:\Python27\lib\site-packages\nltk\cluster\kmeans.py", line 85, in cluster_vectorspace
    self._cluster_vectorspace(vectors, trace)
  File "C:\Python27\lib\site-packages\nltk\cluster\kmeans.py", line 124, in _cluster_vectorspace
    new_means = list(map(self._centroid, clusters, self._means))
  File "C:\Python27\lib\site-packages\nltk\cluster\kmeans.py", line 173, in _centroid
    assert(False)
AssertionError

程序老是刚开始执行就出现问题,于是我觉得解决这个问题。
这个问题出现的原因是有的聚簇没有包含节点,但kmeans聚类认为所有聚类都应该有节点,于是就报错,我的解决办法是,如果发现有的聚簇没有节点,那么就重新生成随机中心,然后开始聚类。
解决方案如下:
clusterer = KMeansClusterer(i,euclidean_distance,repeats=10,avoid_empty_clusters=True)
发现几个有意思的地方:
1.    C:\Python27\Lib\site-packages\nltk\cluster中的kmean.py中的函数
def _centroid(self, cluster, mean):
        if self._avoid_empty_clusters:
            centroid = copy.copy(mean)
            for vector in cluster:
                centroid += vector
            return centroid / (1+float(len(cluster)))

        else:
            if not len(cluster):
                sys.stderr.write('Error: no centroid defined for empty cluster.\n')
                sys.stderr.write('Try setting argument \'avoid_empty_clusters\' to True\n')
                assert(False)
            centroid = copy.copy(cluster[0])
            for vector in cluster[1:]:
                centroid += vector
            return centroid / float(len(cluster))
2.
      # recalculate cluster means by computing the centroid of each cluster
                new_means = list(map(self._centroid, clusters, self._means))
小结:所谓_avoid_empty_clusters是说,如果为True,就意味着如果有空簇,原来centroid不变。如果为false,那么报错。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有