2012-07-10 572 views
1

我有兩個M X N矩陣,我從圖像中提取數據後構建。這兩個矢量都有很長的第一行,在第三行之後它們都只成爲第一列。 例如原矢量看起來像這樣Python:餘弦相似度m * n矩陣

1,23,2,5,6,2,2,6,2, 
12,4,5,5, 
1,2,4, 
1, 
2, 
2 
: 

兩種載體具有類似的圖案,其中第一三行具有冗長行,然後薄出來,因爲它的進展。做餘弦相似性我正在考慮使用填充技術來添加零,並使這兩個向量N X N.我查看了餘弦相似性的Python選項,但一些示例使用了包調用numpy。我無法弄清楚numpy究竟是如何做這種類型的填充和執行餘弦相似性的。任何指導將不勝感激。

回答

3

如果兩個數組具有相同的維度,我會使用NumPy將它們弄平。 NumPy(和SciPy)是一種功能強大的科學計算工具,可以使矩陣操作更加輕鬆。

這裏我將如何使用與NumPy和SciPy的做到這一點的例子:

import numpy as np 
from scipy.spatial import distance 

A = np.array([[1,23,2,5,6,2,2,6,2],[12,4,5,5],[1,2,4],[1],[2],[2]], dtype=object) 
B = np.array([[1,23,2,5,6,2,2,6,2],[12,4,5,5],[1,2,4],[1],[2],[2]], dtype=object) 

Aflat = np.hstack(A) 
Bflat = np.hstack(B) 

dist = distance.cosine(Aflat, Bflat) 

這裏的結果是dist = 1.10e-16(即0)。

請注意,我在這裏使用了dtype=object,因爲這是我知道能夠在NumPy中將不同形狀存儲到數組中的唯一途徑。這就是爲什麼後來我用hstack()爲了平整陣列(而不是使用更常見的flatten()函數)。

0

爲什麼不能在兩個交錯列表上運行嵌套循環(大概),使用歐幾里得/向量點積計算每行,並將結果用作相似性度量。這假定鋸齒尺寸是相同的。

雖然我不太清楚你是如何從位圖圖像中得到一個鋸齒狀的數組(我會假定它是一個適當的MxN形式的密集矩陣)或上面的鋸齒狀數組是如何表示的一個MxN矩陣/圖像數據,因此,如何用零填充數據會有意義?如果這是一個稀疏矩陣表示,則可以期望用這些值註釋的行/列信息。

3

我會讓它們變成一個scipy稀疏矩陣(http://docs.scipy.org/doc/scipy/reference/sparse.html),然後從scikit學習模塊運行餘弦相似度。

from scipy import sparse 
sparse_matrix= scipy.sparse.csr_matrix(your_np_array) 

from sklearn.metrics import pairwise_distances 
from scipy.spatial.distance import cosine 

distance_matrix= pairwise_distances(sparse_matrix, metric="cosine") 
+2

這是怎麼得到票。這是scipy提供的錯誤:'TypeError:scipy distance metrics不支持稀疏矩陣。'我錯過了什麼嗎? – zbinsd 2013-10-11 04:08:34

+0

不適用於稀疏矩陣 – Medeiros 2013-10-12 15:54:18

+0

它對於稀疏矩陣也不適用。我得到了同樣的錯誤。你能解決這個問題嗎? – 2015-10-16 10:49:33