首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >稀疏向量中的欧几里德距离与余弦距离--为什么欧几里得能表现得更好?

稀疏向量中的欧几里德距离与余弦距离--为什么欧几里得能表现得更好?
EN

Stack Overflow用户
提问于 2017-09-01 15:31:23
回答 1查看 868关注 0票数 3

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

现在,由于我处理的向量非常稀疏,我假设余弦距离的计算要比欧几里得快得多,但情况似乎并非如此。

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

(all_distances包含多种类型的距离,但我们这里讨论的唯一距离是scipy.spatial.distance.euclideanscipy.spatial.distance.cosine)

我的代码

代码语言:javascript
运行
复制
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)))

结果:

余弦平均时间: 0.8034s 欧几里德平均时间: 0.708s

EN

回答 1

Stack Overflow用户

发布于 2017-09-01 20:09:40

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

代码语言:javascript
运行
复制
cos(theta) = dot(a,b) / (norm(a) * norm(b))

所以,即使点积只在a[i]b[i]都是非零的情况下累积,你仍然需要积累ab的范数,这本身就是积累欧几里得距离的工作量。

大多数工作都是在迭代稀疏向量--注意,实际上它们之间的性能并没有太大的差别。然而,对这种差异的一个合理的解释是,余弦计算需要做更多的算术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46003600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档