向量之一全为零时的余弦相似度

Posted

技术标签:

【中文标题】向量之一全为零时的余弦相似度【英文标题】:Cosine similarity when one of vectors is all zeros 【发布时间】:2014-12-29 05:57:49 【问题描述】:

余弦相似度如何表示(http://en.wikipedia.org/wiki/Cosine_similarity)

当其中一个向量全为零时?

v1 = [1, 1, 1, 1, 1]

v2 = [0, 0, 0, 0, 0]

当我们根据经典公式计算时,我们得到除以零:

Let d1 = 0 0 0 0 0 0
Let d2 = 1 1 1 1 1 1
Cosine Similarity (d1, d2) =  dot(d1, d2) / ||d1|| ||d2||dot(d1, d2) = (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) = 0

||d1|| = sqrt((0)^2 + (0)^2 + (0)^2 + (0)^2 + (0)^2 + (0)^2) = 0

||d2|| = sqrt((1)^2 + (1)^2 + (1)^2 + (1)^2 + (1)^2 + (1)^2) = 2.44948974278

Cosine Similarity (d1, d2) = 0 / (0) * (2.44948974278)
                           = 0 / 0

我想在集群应用程序中使用这种相似性度量。 我经常需要比较这些向量。 还有 [0, 0, 0, 0, 0] 与 [0, 0, 0, 0, 0]

你有什么经验吗? 由于这是一个相似性(不是距离)度量,我应该使用特殊情况

d( [1, 1, 1, 1, 1]; [0, 0, 0, 0, 0] ) = 0

d([0, 0, 0, 0, 0]; [0, 0, 0, 0, 0] ) = 1

怎么样

d([1, 1, 1, 0, 0]; [0, 0, 0, 0, 0] ) = ?等等

【问题讨论】:

【参考方案1】:

如果你有 0 个向量,cosine 对你的应用来说是错误的相似度函数

余弦距离本质上等同于 L_2 归一化数据上的平方欧几里得距离。 IE。您将每个向量归一化为单位长度 1,然后计算平方欧几里德距离。

余弦的另一个好处是性能 - 在非常稀疏的高维数据上计算它比欧几里得距离更快。它受益于稀疏到正方形,而不仅仅是线性。

虽然您显然可以尝试在恰好 1 为 0 时将相似度设为 0,并在它们相同时将相似度设为最大值,但这并不能真正解决潜在的问题。

不要根据您可以轻松计算的距离来选择距离。

相反,选择距离以使结果对您的数据具有意义。如果值未定义,你就没有意义……

有时,无论如何将常量 0 数据丢弃为无意义的数据可能会起作用(例如,分析 Twitter 噪音,并看到一条全是数字而没有文字的推文)。有时不会。

【讨论】:

那么在这种情况下,更合适的相似性度量是什么?汉明距离? 没有给出上下文。欧几里得距离也可能“更合适”。【参考方案2】:

未定义。

认为你有一个不为零的向量 C 代替你的零向量。将它乘以 epsilon > 0 并让 epsilon 运行为零。结果将取决于 C,因此当向量之一为零时,函数不连续。

【讨论】:

以上是关于向量之一全为零时的余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章

余弦相似度计算

余弦相似度

20-余弦相似度及其R实现

Spark笔记(1) :余弦相似度计算

相似度算法之余弦相似度

智能推荐算法基础-余弦相似度计算