2014-02-10 126 views
1

我正在研究大學任務的KNN算法,此刻我正在尋找作爲Scipy lil_matrix存儲的每個訓練矢量之間的歐幾里得距離(由於由於上述相同的原因,向量中的值的稀疏性)以及作爲1×nil_matrix存儲的測試向量。Scipy稀疏矩陣和稀疏矢量之間的歐幾里德距離

制定出歐氏距離,然後我做了下面的代碼:

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

哪裏sentenceVector是1行的lil_matrix和陽性是大小爲n×m的一個lil_matrix。

我想試着找出一些東西,比逐行檢查正向矩陣和每次評估歐氏距離,並且可能運行正向量矩陣和sentenceVector向量之間的歐氏距離,並返回1 xm矩陣與歐氏距離。 我想這樣做的原因是,目前的系統計算相對較慢,因爲它基本上是NM時間複雜度,因爲我需要計算多個句子測試。 這是可能的,如果是的話,我會怎麼做?

注意,任務是使用不同的K值的KNN算法,而不是實際執行的KNN(雖然我們不允許使用KNN庫做任務)

回答

3

您可以評估性能計算批歐氏距離很容易:

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 

這是可能的,但你需要使用some tricks

更重要的是,你應該看看你的矢量真的有多大(以及如何稀疏)。你可能會更快地讓所有的東西都變得密集起來,它肯定會爲你節省一些頭痛。

最後,我會避免使用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]]) 
+0

我最初只是使用numpy數組,但矢量大小非常大,數據非常稀疏。存儲零值會導致訓練集大約5GB,只存儲非零值,降至20-30MB。巨大的差異。我使用lil_matrix,因爲我在開始時定義了矩陣的大小,但是需要通過x,y座標爲它指定值,並且只能找到使用lil_matrix來完成的方法。我不確定我是否可以使用scikit-learn,會詢問它,所以現在我將查看一下提到的一些技巧文章。 – Lincoln

+0

如果你不能使用sklearn,你可以隨時調整相關函數: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/pairwise.py#L109 – perimosocordiae