在 python 中使用 scipy.spatial.distance.cosine() 之前是否需要对数据进行规范化?
如果“规范化”数据仅涉及将输入乘以标量,那么不,您不需要规范化。查看docstring 中的距离公式。现在假设 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