我无法找到任何关于scipy群集的简单教程或描述,所以我会尝试解释我的问题:
我尝试对文档进行聚类(分层凝聚聚类),并为每个文档创建一个向量,并生成对称距离矩阵。 vector_list包含(实际上很长)代表每个文档的向量。这个向量列表的顺序与我的输入文档列表相同,这样我(希望)能够将聚类的结果与相应的文档相匹配。
distances = distance.cdist(vector_list, vector_list, 'euclidean')
这给出了这样的矩阵,其中对角线是每个文档到自身的距离(总是0)
[0 5 4]
[5 0 4]
[5 4 0]
我将此距离矩阵提供给scipys的linkage()函数。
clusters = hier.linkage(distances, method='centroid', metric='euclidean')
这会返回一些我不太确定的东西,但是以数据类型numpy.ndarray的形式出现。根据文档,我可以再次将其提供给fcluster以获得“扁平集群”。我使用距离矩阵中最大距离的一半作为阈值。
idx = hier.fcluster(clu,0.5*distances.max(), 'distance')
这会返回一个对我来说没有多大意义的numpy.ndarray。一个例子是[6 3 1 7 1 8 9 4 5 2]
所以我的问题是:我从链接和 fcluster 函数得到了什么,我怎样才能从那里回到我创建的文档距离矩阵首先,看看群集是否有意义?我这样做了吗?
答案 0 :(得分:3)
首先,如果您使用cdist
代替linkage
,则无需使用fclusterdata
和fcluster
完成整个过程;该功能可以提供(n_documents, n_features)
一组术语计数,tf-idf值或任何功能。
fclusterdata
的输出与fcluster
的输出相同:数组T
,“T[i]
是原始观察{{1}的平面群集编号属于。“即,i
模块根据您在cluster.hierarchy
设置的阈值来展平群集。在您的情况下,第三个和第五个文档聚集在一起,但所有其他文档都形成了自己的聚类,因此您可能希望将阈值设置得更高或使用不同的0.5*distances.max()
。