我有两个数据集 D1 和 D2。每个数据集有 n 个特征(列),特征值有不同的尺度。我需要找到 D1 和 D2 中每对相关样本之间的余弦距离,以量化 D1 和 D2 的相似程度。在使用余弦距离之前是否需要对 D1 和 D2 进行归一化?我正在使用 scipy.spatial.distance.cosine(u, v) 来查找样本 u 和样本 v 之间的距离。
谢谢!
我有两个数据集 D1 和 D2。每个数据集有 n 个特征(列),特征值有不同的尺度。我需要找到 D1 和 D2 中每对相关样本之间的余弦距离,以量化 D1 和 D2 的相似程度。在使用余弦距离之前是否需要对 D1 和 D2 进行归一化?我正在使用 scipy.spatial.distance.cosine(u, v) 来查找样本 u 和样本 v 之间的距离。
谢谢!
在 python 中使用 scipy.spatial.distance.cosine() 之前是否需要对数据进行规范化?
如果“标准化”数据仅涉及将输入乘以标量,那么不,您不需要标准化。查看文档字符串中距离的公式。现在假设a和b是正标量。然后
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