我有n个单词及其相关权重给我一个n * n矩阵。我将把它用于搜索算法,但问题是我需要根据它们的成对关系对输入的关键字进行聚类。所以,假设关键字是{网球,费德勒,温布尔登,伦敦,警察},我们的权重矩阵中包含以下数据:
tennis federer wimbledon london police
tennis 1 0.8 0.6 0.4 0.0
federer 0.8 1 0.65 0.4 0.02
wimbledon 0.6 0.65 1 0.08 0.09
london 0.4 0.4 0.08 1 0.71
police 0.0 0.02 0.09 0.71 1
我需要一个算法将它们聚类成2个集群:{tennis,federer,wimbledon} {london,police}。是否有任何已知的聚类算法可以处理这样的事情?我做了一些研究,似乎K-means算法是用于聚类的最着名的算法,但显然K-means不适合这种情况。 我非常感谢任何帮助。
答案 0 :(得分:2)
您可以将其视为网络群集问题。使用最新版本的mcl软件(http://micans.org/mcl),您可以执行此操作(我将您的示例称为fe.data)。
mcxarray -data fe.data -skipr 1 -skipc 1 -write-tab fe.tab -write-data fe.mci -co 0 -tf 'gq(0)' -o fe.cor
# the above computes correlations (put in data file fe.cor) and a network (put in data file fe.mci).
# below proceeds with the network.
mcl fe.mci -I 3 -o - -use-tab fe.tab
# this outputs the clustering you expect. -I is the 'inflation parameter'. The latter affects
# cluster granularity. With the default parameter 2, everything ends up in a single cluster.
免责声明:我写了mcl和一系列相关的网络加载/转换和分析程序,最近更名为'mcl-edge'。它们都集中在一个软件包中。看到你的例子让我很好奇是否可以使用mcl-edge,所以我很快就测试了它。
答案 1 :(得分:1)
考虑DBSCAN。如果它符合您的需求,您可能希望仔细查看优化版本TI-DBSCAN,它使用三角不等式来降低空间查询成本。
DBSCAN的优点和缺点是discussed on Wikipedia。它将输入数据拆分为一组基数,其基数未知 a priori 。您必须将相似度矩阵转换为距离矩阵,例如将1 - similarity
作为距离。
答案 2 :(得分:0)
查看有关信息检索的书籍
http://nlp.stanford.edu/IR-book/html/htmledition/hierarchical-agglomerative-clustering-1.html
它很好地解释了你想要做什么
答案 3 :(得分:0)
对于更相似的单词,您的权重更高,对于更多不同的单词,您的权重更低。聚类算法要求类似的点/单词在空间上更接近,而不同的单词要远离。您应该将矩阵M
更改为1-M
,然后使用您想要的任何聚类方法,包括k-means。
答案 4 :(得分:0)
如果你有距离矩阵,那么尝试http://en.wikipedia.org/wiki/Single_linkage_clustering似乎很遗憾。手动,我认为你得到以下聚类:
<(>(费德勒,网球),温布尔登)(伦敦,警察)加入两个主要群体(网球 - 伦敦或者费德勒 - 伦敦)的链接的相似性小于建立这两个群体的任何相似之处:伦敦警察,网球联盟和联邦 - 温布尔登:单链接聚类保证了这一特性,因为它在每个阶段将最近的聚类结合在一起,并且两个主要的组通过找到的最后一个聚类链接。
答案 5 :(得分:0)
DBSCAN(参见其他答案)和OPTICS等后继者显然是一种选择。
虽然示例是关于矢量数据,但算法需要的只是距离函数。如果你有一个相似矩阵,那么可以简单地用作距离函数。
示例数据集可能有点太小,无法产生有意义的结果。如果你只有这么少的数据,任何“层次聚类”都应该是可行的,并为你完成工作。然后,您只需确定最佳群集数量。