簡體   English   中英

稀疏矩陣與稀疏向量之間的歐式距離

[英]Euclidean Distance between Scipy Sparse Matrix and Sparse Vector

我正在研究用於大學分配的KNN算法,目前正在尋找存儲為Scipy lil_matrix(由於向量中值的稀疏性)而存儲的每個訓練向量之間的歐幾里得距離。出於與上述相同的原因,測試向量存儲為1 xn lil_matrix。

為了計算出歐幾里得距離,我在做下面的代碼:

for positiveIndex, positivesComparison in enumerate(positives):
    result.append((spatial.distance.euclidean(positivesComparison.todense(),sentenceVector.todense() ), positiveIndex, 1))

其中句子向量是1行的lil_matrix,正數是大小為nx m的lil_matrix。

我想嘗試解決問題的速度比逐行通過正矩陣並每次評估歐幾里得距離要快,並且也許運行正矩陣與句子向量之間的歐幾里得距離,並用歐幾里得返回一個1 xm矩陣距離。 我要這樣做的原因是當前系統的計算速度相對較慢,因為它基本上是一個NM時間復雜度,因為我需要計算多個句子測試。 這有可能嗎,如果可以,我該怎么辦?

請注意,任務是針對KNN算法使用不同的K值來評估性能,而不是針對KNN的實際實現進行評估(盡管我們不允許使用KNN庫來執行任務)

您可以很容易地計算出批量歐幾里得距離:

In [10]: a = np.random.random(size=(4,5))

In [11]: b = np.random.random(size=(1,5))

In [12]: from scipy.spatial.distance import euclidean

In [13]: [euclidean(aa, b) for aa in a]
Out[13]: [1.1430615949614429, 0.568517046878056, 1.3302284168375587, 1.0581730230363529]

In [14]: np.sqrt(np.sum((a - b)**2, axis=1))
Out[14]: array([ 1.1431,  0.5685,  1.3302,  1.0582])

但是我們要使用稀疏矩陣,這會使事情變得更加困難:

In [22]: import scipy.sparse as ss

In [23]: sa = ss.lil_matrix(a)

In [24]: sb = ss.lil_matrix(b)

In [25]: np.sqrt(np.sum((sa - sb)**2, axis=1))  # <-- ValueError: inconsistent shapes

可以這樣做,但是您需要使用一些技巧

更重要的是,您應該查看向量的實際大小(以及稀疏程度)。 您可能會更快地將所有內容保持密集狀態,這肯定會為您節省一些麻煩。

最后,我避免使用LIL格式的矩陣,因為它們是可用的最慢的格式之一。 對於您的情況,請查看CSR格式。

編輯 :我忘記了最簡單的解決方案:使用scikit-learn

In [36]: from sklearn.metrics import pairwise_distances

In [37]: pairwise_distances(a, b)
Out[37]:
array([[ 1.1431],
       [ 0.5685],
       [ 1.3302],
       [ 1.0582]])

In [38]: pairwise_distances(sa, sb)
Out[38]:
array([[ 1.1431],
       [ 0.5685],
       [ 1.3302],
       [ 1.0582]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM