当其中一个向量全为零时的余弦相似度

如何表达余弦相似度( 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 0Let d2 = 1 1 1 1 1 1Cosine 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.44948974278Cosine 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] ) = ? 等等。


回答:

如果你有零向量,余弦不是适合你应用的相似度函数

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

余弦的另一个好处是性能 – 在非常稀疏、高维度的数据上计算它比欧几里得距离更快。它从稀疏性中获益是平方的,而不仅仅是线性的。

虽然你显然可以尝试在其中一个向量为零时将相似度设为0,而在它们完全相同的时候设为最大值,但这并不能真正解决根本问题。

不要因为你能轻松计算而选择距离度量。

相反,选择一个距离度量,使结果在你的数据上具有意义。如果值是未定义的,那么你就没有意义…

有时候,丢弃全为零的数据作为无意义数据可能是可行的(例如,分析Twitter噪音,看到一条全是数字没有文字的推文)。有时候则不行。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注