【发布时间】:2018-02-10 17:12:48
【问题描述】:
我有一个非常稀疏向量 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
【问题讨论】:
-
解释为什么你认为应该更快(只是因为稀疏)。您似乎没有使用
scipysparse矩阵。 -
看公式docs.scipy.org/doc/scipy/reference/generated/… 我可以看到两个向量中的任何一个都为零的元素不需要计算,所以我相信余弦的迭代应该快得多,因为 95+ 百分比同一索引中的两个元素中的任何一个都为零。
-
不,我没有使用
scipy.sparse我实际上从未接触过它,如果它可以提高余弦性能,我很乐意听到我在这个用例中使用它 -
测试零也需要时间;函数通常不会添加该步骤,除非它们期望稀疏输入。即使这样,最好提前告诉他们要跳过哪些计算。 Pandas 有自己的稀疏代码。
-
那么我将如何处理稀疏向量中的不同距离函数?
标签: python performance math scipy mathematical-optimization