python - 稀疏向量中的欧几里德距离与余弦距离 - 欧几里得如何表现更好?

标签 python performance math scipy mathematical-optimization

我有一个非常稀疏的向量 df 数据集(超过 95% 的零),我正在测量另一个稀疏向量 sample 之间的距离。

现在,由于我正在处理非常稀疏的向量,我假设余弦距离的计算速度会比欧几里德距离快得多,但事实似乎并非如此。

这是正常行为吗?还是我做错了什么?或者余弦距离在稀疏向量中更有效甚至不是真的?

(all_distances 包括许多类型的距离,但我们在这里讨论的只有 scipy.spatial.distance.euclideanscipy.spatial。距离.余弦)

我的代码

for d_name, d_func in all_distances.items():

    tot_time = []
    for i in range(100):
        start_time = time()
        df['distance'] = df.apply(d_func, axis=1, args=(sample,))
        df.sort_values(by='distance', ascending=True, inplace=True)
        df.drop('distance', axis=1, inplace=True)
        df = df.reset_index(drop=True)
        tot_time.append(time() - start_time)
    
     print("Mean time for {}: {}s".format(d_name, round(mean(tot_time), 4)))

结果:

Mean time for cosine: 0.8034s

Mean time for euclidean: 0.708s

最佳答案

余弦相似度需要两个输入向量的范数,以及它们之间的点积:

cos(theta) = dot(a,b) / (norm(a) * norm(b))

因此,即使点积仅在 a[i]b[i] 都非零时才累加,您仍然需要累加两者的范数 ab,它们本身的工作量与累积欧氏距离差不多。

无论如何,大部分工作都将通过稀疏向量进行迭代——请注意,它们之间的性能实际上并没有太大差异。然而,对差异的一个合理解释是余弦计算需要做更多的算术运算。

关于python - 稀疏向量中的欧几里德距离与余弦距离 - 欧几里得如何表现更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003600/

相关文章:

Perl 线程比顺序处理更快?

C正则表达式性能

java - 你能用 Java 复制 Excel 中的 Floor 函数吗?

algorithm - N以下有多少个数是N的互质数?

python - Numpy.eig 和 PCA 中的方差百分比

python - 一台虚拟主机上的多个 mod_wsgi 应用程序指向错误的应用程序

python - Matplotlib:同一轴上具有不同左右比例的两个图

python - 如何为 python 的 keras LSTM 塑造大型 DataFrame?

python - 无法在 heroku django 中导入名称 _uuid_generate_random

php - 减少包含/需要的数量会提高性能吗?