余弦相似度与欧几里得距离 (LSA) 的 K 均值

机器算法验证 k-均值 svd 潜在语义分析 余弦距离 余弦相似度
2022-03-25 21:08:56

我正在使用潜在语义分析来表示低维空间中的文档语料库。我想使用 k-means 将这些文档分为两组。

几年前,我使用 Python 的 gensim 并编写了自己的 k-means 算法来做到这一点。我使用欧几里得距离确定聚类质心,然后根据与质心的余弦相似度对每个文档进行聚类。它似乎工作得很好。

现在我正在尝试在更大的文档语料库上执行此操作。K-means 没有收敛,我想知道这是否是我的代码中的错误。我最近读到您不应该使用余弦相似度进行聚类,因为 k-means 仅适用于欧几里得距离。尽管,正如我所提到的,它在我较小的测试用例中似乎运行良好。

现在我在LSA 维基百科页面上看到了这个:

可以使用传统的聚类算法(如 k-means)使用余弦等相似性度量对文档和术语向量表示进行聚类。

那么它是哪一个?我可以使用余弦相似度吗?

3个回答

是的,你可以使用它。问题是,余弦相似度不是距离,这就是它被称为相似度的原因。不过,它可以转换为距离,如此所述。

事实上,你可以使用任何距离。对高维空间中距离函数属性的一个很好的研究(就像信息检索中通常的情况一样)是On the Surprising Behavior of Distance Metrics in High Dimensional Space它没有比较欧几里得与余弦。

我遇到了这项研究,他们声称在高维空间中,两个距离的行为往往相似。

欧几里得距离不适合比较文档或文档簇。在比较文档时,一个关键问题是文档长度的标准化。余弦相似度实现了这种归一化,但欧式距离没有。此外,文档通常被建模为多项概率分布(所谓的词袋)。余弦相似度是 JS-divergence 的近似值,它是一种统计上合理的相似度方法。文档和余弦的一个关键问题是应该对计数应用适当的 tf-idf 标准化。如果您使用 gensim 导出 LSA 表示,gensim 已经这样做了。

对于 2 个集群的用例,另一个有用的观察结果是,您可以获得良好的非随机初始化,因为 LSA 只是 SVD。您可以通过以下方式执行此操作:

  • 只取每个文档的第一个组件(假设第一个组件是顶部奇异向量)。
  • 通过跟踪每个值的文档 ID 对这些值进行排序。
  • 集群 1 = 对应于顶部的文档 ID,例如 1000 个(或更多)值
  • 集群 2 = 对应于底部的文档 ID,例如 1000(或更多)值
  • 只需平均每个集群的向量并按向量长度进行归一化。
  • 现在将 k-means 应用于此初始化。这意味着只需迭代 (1) 将文档分配到当前最近的质心和 (2) 在重新分配后对新质心进行平均和标准化

是的,矢量平均更新相同的质心有效。

参见本文第 2.2 节中的 m=1 案例。w 是权重,对于基本 k 均值算法,权重均为 1。

本文使用 Cauchy-Schwartz 不等式的性质来建立使 k-mean 的成本函数最小化的条件。

还要记住,余弦相似度不是向量距离。余弦相异是。(这应该是一个很好的搜索词。)因此,当您更新分区时,您正在寻找而arg max不是arg min.