1

我有两个数据集 D1 和 D2。每个数据集有 n 个特征(列),特征值有不同的尺度。我需要找到 D1 和 D2 中每对相关样本之间的余弦距离,以量化 D1 和 D2 的相似程度。在使用余弦距离之前是否需要对 D1 和 D2 进行归一化?我正在使用 scipy.spatial.distance.cosine(u, v) 来查找样本 u 和样本 v 之间的距离。

谢谢!

4

1 回答 1

-1

在 python 中使用 scipy.spatial.distance.cosine() 之前是否需要对数据进行规范化?

如果“标准化”数据仅涉及将输入乘以标量,那么不,您不需要标准化。查看文档字符串中距离的公式。现在假设ab是正标量。然后

cosine(a*u, b*v) = 1 - dot(a*u, b*v)/(norm(a*u)*norm(b*v))
                 = 1 - a*b*dot(u, v)/(a*b*norm(u)*norm(v))
                 = 1 - dot(u, v)/(norm(u)*norm(v))
                 = cosine(u, v)

因此,用于规范化输入的比例因子将取消并且不会影响结果。

您可以在一个简单的示例中看到这一点:

In [17]: from scipy.spatial.distance import cosine

In [18]: u = np.array([1.0, 3.0, 5.0, 10.0])

In [19]: v = np.array([-3.0, 1.0, 0.0, 2.0])

In [20]: cosine(u, v)
Out[20]: 0.5399562937717639

In [21]: cosine(u/10, v)
Out[21]: 0.5399562937717639

In [22]: cosine(3*u, 4*v)
Out[22]: 0.5399562937717639
于 2020-03-26T04:04:42.030 回答