如何表达余弦相似度( 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噪音,看到一条全是数字没有文字的推文)。有时候则不行。