余弦相似度聚类

Posted

技术标签:

【中文标题】余弦相似度聚类【英文标题】:clustering with cosine similarity 【发布时间】:2012-06-24 10:01:15 【问题描述】:

我有一个想要聚类的大型数据集。我的试运行集大小是 2,500 个对象;当我在“真正的交易”上运行它时,我将需要处理至少 20k 个对象。

这些对象之间具有余弦相似度。这种余弦相似度不满足作为数学距离度量的要求;它不满足三角不等式。

我想以某种“自然”的方式对它们进行聚类,将相似的对象放在一起,而无需事先指定我期望的聚类数量。

有没有人知道可以做到这一点的算法?真的,我只是在寻找不需要 a) 距离度量和 b) 预先指定数量的集群的任何算法。

非常感谢!

这个问题之前在这里被问过: Clustering from the cosine similarity values (但此解决方案仅提供 K-means 聚类),这里: Effective clustering of a similarity matrix (但这个解决方案相当模糊)

【问题讨论】:

来自en.wikipedia.org/wiki/Cosine_similarity:“虽然“余弦相似度”这个词已经被用于这个角度距离,但这个词被奇怪地使用了,因为角度的余弦只是作为一种方便的机制来计算角度本身,不是意义的一部分。角度相似系数的优点是,当用作差异系数时(通过从 1 中减去它)得到的函数是一个适当的距离度量,它不是第一个意思的情况。” 谢谢!不幸的是,我应该更具体一些;我正在使用我自己定义的类似余弦的相似性。不满足三角不等式。 【参考方案1】:

Apache mahout 有许多聚类算法,包括一些不需要您指定 N 并允许您指定距离度量的算法。

均值偏移聚类类似于 k-means,但没有预先指定数量的聚类https://cwiki.apache.org/confluence/display/MAHOUT/Mean+Shift+Clustering。

然后更一般地说,如果您想尝试各种算法,有绝对丰富的可用于 R 的复杂包(包括一些 EM 的变分贝叶斯实现,它们将选择最佳数量的集群)已经证明对我过去的一些研究非常有用:http://cran.r-project.org/web/views/Cluster.html

【讨论】:

【参考方案2】:

实际上大多数需要“距离函数”的算法并不要求它是度量的。

DBSCAN 可以概括(参见***)到一个甚至从远处抽象出来的版本,它只需要有某种“密集”的概念。 (DBSCAN也不需要事先知道簇的数量)

但即使是对距离有相当严格要求的 k-means,甚至超出了度量标准 - 也有一种称为球形 k-means 的变体。

无论如何,在数据库上下文中,“度量”的全部要求都是空想的。在任何现实世界的数据中,可能有两条具有相同坐标的记录,因此您最多会有一个伪度量。三角不等式主要用于优化(例如,通过使用具有严格三角不等式要求的 M-tree 索引)或利用此属性的加速 k 均值。

【讨论】:

【参考方案3】:

您也可以尝试亲和传播 (http://www.psi.toronto.edu/index.php?q=affinity%20propagation)。该算法以相似度矩阵作为输入,并且我相信它还可以自动调整聚类质心的数量。

【讨论】:

以上是关于余弦相似度聚类的主要内容,如果未能解决你的问题,请参考以下文章

对 TF-IDF 特征向量中的特定特征进行加权,用于 k-means 聚类和余弦相似度

数据挖掘视觉模式挖掘:Hog特征+余弦相似度/k-means聚类

similarity和clustering 相似性和聚类

余弦相似度计算

余弦相似度

余弦计算相似度理解以及计算