我有一个非常稀疏的向量df数据集(超过95%的零),我正在测量另一个稀疏向量sample之间的距离。
现在,由于我处理的向量非常稀疏,我假设余弦距离的计算要比欧几里得快得多,但情况似乎并非如此。
这是正常行为吗?还是我做错什么了?或者,在稀疏向量中,余弦距离更有效的说法甚至不是真的?
(all_distances包含多种类型的距离,但我们这里讨论的唯一距离是scipy.spatial.distance.euclidean和scipy.spatial.distance.cosine)
我的代码
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
发布于 2017-09-01 20:09:40
余弦相似性需要两个输入向量的范数,以及它们之间的点积:
cos(theta) = dot(a,b) / (norm(a) * norm(b))所以,即使点积只在a[i]和b[i]都是非零的情况下累积,你仍然需要积累a和b的范数,这本身就是积累欧几里得距离的工作量。
大多数工作都是在迭代稀疏向量--注意,实际上它们之间的性能并没有太大的差别。然而,对这种差异的一个合理的解释是,余弦计算需要做更多的算术。
https://stackoverflow.com/questions/46003600
复制相似问题