我正在对大约15,000个具有90个维度的文档的Doc2Vec模型进行分层聚类。
虽然使用SciPy的fcluster函数来检索平面集群是有用的,但由于集群之间的显着差异,它产生的某些集群成员太少(文档的> 1%)或信息过多(<45%)在相同距离级别上的尺寸。
以下是一个包含前100个链接的截断树状图的数据示例:
(请注意x轴上不同叶子上的簇大小之间存在显着差异)
我生成此树状图并检索平坦簇的代码如下:
dm = pdist(X, 'cosine') # X is the array containing doc vectors
method = 'average'
Z = linkage(dm, method=method, metric='cosine', optimal_ordering=False)
def fancy_dendrogram(*args, **kwargs):
max_d = kwargs.pop('max_d', None)
if max_d and 'color_threshold' not in kwargs:
kwargs['color_threshold'] = max_d
annotate_above = kwargs.pop('annotate_above', 0)
ddata = dendrogram(*args, **kwargs)
if not kwargs.get('no_plot', False):
plt.title('Truncated Hierarchical Clustering Dendrogram (method = %s)'%method)
plt.xlabel('sample index or (cluster size)')
plt.ylabel('distance')
for i, d, c in zip(ddata['icoord'], ddata['dcoord'], ddata['color_list']):
x = 0.5 * sum(i[1:3])
y = d[1]
if y > annotate_above:
plt.plot(x, y, 'o', c=c)
plt.annotate("%.3g" % y, (x, y), xytext=(0, -5),
textcoords='offset points',
va='top', ha='center')
if max_d:
plt.axhline(y=max_d, c='k')
return ddata
fancy_dendrogram(
Z,
color_threshold=0.94,
truncate_mode='lastp',
p=100,
leaf_rotation=90.,
leaf_font_size=12.,
show_contracted=True,
annotate_above=0, # useful in small plots so annotations don't overlap
max_d=None
)
plt.show()
print(colored("\n Choose your method for flat cluster retrieval.\n", "green"))
method = input(colored("Number or distance? "))
if method == "number":
k = input("Enter the number of clusters to retrieve: ")
cluster = fcluster(Z, k, criterion='maxclust')
if method == "distance":
max_d = input("Enter the distance cutoff: ")
cluster = fcluster(Z, max_d, criterion='distance')
我想做的是沿着树状图的叶子走,停止检索具有少于 n 个成员(例如,语料库的30%)且大于的簇m 个成员(例如,语料库的5%),因此每个聚类的大小可使其具有更好的人类可解释性。
我该怎么做?任何指针将不胜感激。