我有一個非常稀疏的矢量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
Mean ti我要歐幾里德:0.708s
解釋爲什麼你認爲應該更快(僅僅是因爲稀疏)。它看起來並不像你使用'scipy''稀疏'矩陣。 – hpaulj
查看公式https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html#scipy.spatial.distance.cosine我可以看到,元素不需要計算在兩個矢量中的任何一個矢量都爲零,所以我相信餘弦中的迭代應該快得多,因爲在相同索引中的兩個元素中的任何一個的95+前綴將是零。 – bluesummers
不,我沒有使用'scipy.sparse'我實際上從來沒有碰過它,如果它會提高餘弦性能,我很樂意聽到我在這個用例中使用它 – bluesummers