使用scipy进行聚类-通过距离矩阵进行聚类,如何获取原始对象

6
我找不到任何关于scipy聚类的简单教程或描述,所以我来尝试解释我的问题: 我尝试对文档进行聚类(分层凝聚聚类),并为每个文档创建了一个向量并生成了一个对称距离矩阵。向量列表包含(非常长的)向量,表示每个文档。此列表中的向量顺序与输入文档列表相同,因此我(希望能够)将聚类结果与相应的文档匹配。
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以获取'flat clusters'。我使用距离矩阵中最大距离的一半作为阈值。

idx = hier.fcluster(clu,0.5*distances.max(), 'distance')

这将返回一个numpy.ndarray,对我来说也不是很清楚。例如:[6 3 1 7 1 8 9 4 5 2]

那么我的问题是:我从linkagefcluster函数中得到了什么,如何从中回到我创建距离矩阵的文档,以查看聚类是否有意义?我做得对吗?

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
首先,如果您使用fclusterdata而不是fcluster,则无需通过整个cdistlinkage过程。该函数可以提供一个(n_documents, n_features)的术语计数、tf-idf值或其他特征的数组。 fclusterdata的输出与fcluster相同:一个数组T,使得“T[i]是原始观察结果i所属的扁平聚类编号”。也就是说,cluster.hierarchy模块根据您在0.5*distances.max()处设置的阈值压缩了聚类。在您的情况下,第三个和第五个文档被聚类在一起,但所有其他文档都形成自己的聚类,因此您可能希望将阈值设置更高或使用不同的criterion

如果我使用fclusterdata,则我的cdist和linkage的用法是多余的。我提供给cdist(vector_list)的输入是一个长的单词计数向量列表,在其中每一行都是与文档集合的完整词汇表进行比较的文本。当你说我可以在(n_documents,n_features)中为fculsterdata“提供任何我的特征”时,你是否指像(document_id:vector)这样的字典例如(1:[0,0,0,1,0,2,0])? - Eiriks
你如何看出第三个和第五个文档被列表[6 3 1 7 1 8 9 4 5 2]聚类在一起? 我想要进一步知道我有多少个聚类,每个聚类有多大,每个聚类中有哪些文本以及每个聚类的中心点是什么。 我看不出数组T怎么能帮助我实现这一点。T [i]中的i只告诉我i在T中的位置,它只是一个参考数字[6 3 1 7 1 8 9 4 5 2]中的一个。 - Eiriks
1
@Eiriks:1. 是的。我所说的特征是指数值。2. 列表中第三个和第五个元素(从1开始计数)具有相同的值。列表中的值是聚类编号。 - Fred Foo
谢谢,现在我终于明白了。这回答了四个问题中的三个。唯一剩下的是:我如何找到质心文档(或每个簇的最接近质心的文档)? PS:感谢您的评论,它对我很有帮助。 - Eiriks
您将不得不自己计算。分层聚类不涉及质心或中心点。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,