你可以为密度聚类对 word2vec 向量进行 l2 归一化吗?

数据挖掘 Python 聚类 word2vec 正常化 数据库扫描
2022-03-12 13:07:41

我有一种情况,我必须对 word2vec 向量进行聚类(一个非常大的语料库上的 200 个长度维度向量)。我决定使用基于密度的聚类(DBSCAN、HDBSCAN),因为我的数据集噪声非常高,我不希望它成为我的集群的一部分。我对余弦距离的了解有限,但我发现基于密度的聚类算法没有使用余弦距离的直接实现(pairwise_distance计算太占用内存)。

我的问题是我可以使用 L2 归一化来归一化 Word2vecnorm_data = normalize(vector_array, norm='l2')向量吗?

当数据集中有噪音时,有人可以建议任何其他更好的技术来聚类词向量吗?

3个回答
  1. 您可以使用余弦相似度进行 DBSCAN、OPTICS、HDBSCAN - 他们不期望或不需要欧几里得距离。

  2. 是的,余弦距离的一个版本很好地对应于 L2 归一化向量的欧几里得距离。所以有一些理论支持L2标准化向量然后尝试欧几里得。

  3. 鉴于 word2vec 的训练方式,我认为欧几里得或余弦距离都不是正确的做法。相反,使用原始点积作为相似性度量(请注意,它不限于 [0;1],而是允许负相似性 - 值可能过于分散而无法直观地使用它们)。

  4. 在评论和另一个答案中讨论的 t-SNE 也依赖于到最近邻居的距离。所以它确实遇到了同样的问题——余弦、欧几里得、点积?快速的 ELKI 实现确实支持余弦距离以及欧几里得,但您似乎已经在 Python 上设置了。此外,如果您的词汇量很大,t-SNE 可能会给您带来一些可扩展性问题。标准算法将需要 O(n²) 内存和时间。

l2归一化词向量之间的欧几里得距离等价于词向量之间的角距离。这与余弦距离不同,但非常相似。值得注意的是,余弦距离实际上并不是一个度量,这迫使许多算法(包括这里讨论的算法)求助于更昂贵的 O(n^2) 渐近性能。

考虑到这一点,我已经使用 HDBSCAN 对使用 word2vec 训练的相似维度词向量进行了很好的聚类,使用的正是您在此处建议的这种 l2 归一化方法。总的来说,我确实发现使用叶簇提取方法而不是传统的质量过剩方法来获得紧密簇是有益的。我发现结果非常好,集群为训练 word2vec 的语料库提供了非常干净的“主题”。

标准化向量将它们全部映射到一个单位球体。这肯定会改变他们的欧几里得距离(虽然不是余弦距离),所以,不,我不认为这是有效的,也对维度没有帮助。

高维聚类确实存在问题,我同意@Emre 的观点,即 t-SNE 是一种为可视化目的获取更有意义的聚类的选项。简单的 PCA 后跟集群也可能有效。