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,那么报错。
转化numpy的array:
numpy_matrix = None
numpy_matrix = [numpy.array(matutils.sparse2full(doc,len(dictionary))) for doc in corpus]
for i in range(8,31):
但执行过程中总是报这样的问题:
Error: no centroid defined for empty cluster.
Try setting argument 'avoid_empty_clusters' to True
Traceback (most recent call last):
AssertionError
程序老是刚开始执行就出现问题,于是我觉得解决这个问题。
这个问题出现的原因是有的聚簇没有包含节点,但kmeans聚类认为所有聚类都应该有节点,于是就报错,我的解决办法是,如果发现有的聚簇没有节点,那么就重新生成随机中心,然后开始聚类。
解决方案如下:
clusterer = KMeansClusterer(i,euclidean_distance,repeats=10,avoid_empty_clusters=True)
发现几个有意思的地方:
1.
def _centroid(self, cluster, mean):
2.
小结:所谓_avoid_empty_clusters是说,如果为True,就意味着如果有空簇,原来centroid不变。如果为false,那么报错。