2016-04-28 145 views
0

我試圖瞭解如何使用csr_matrix API及其cosine功能,並且我遇到了dimension mismatch問題。稀疏矩陣之間的餘弦距離

我有以下兩個(3,3)的矩陣:

a = scipy.sparse.csr_matrix(np.reshape(np.arange(9), (3,3))) 
b = scipy.sparse.csr_matrix(np.reshape(np.arange(9)*2+5, (3,3))) 

我想從a[0]b[0]一拉cosine(a[0], b[0])計算餘弦相似度(或餘弦距離)。

如果我打印出來的a[0], b[0]的尺寸,我得到:

(<1x3 sparse matrix of type '<class 'numpy.int64'>' 
    with 2 stored elements in Compressed Sparse Row format>, 
<1x3 sparse matrix of type '<class 'numpy.int64'>' 
    with 3 stored elements in Compressed Sparse Row format>) 

因此,他們的尺寸相匹配。但嘗試cosine(a[0], b[0])結果在ValueError: dimension mismatch。任何想法爲什麼?

+0

可能您需要轉置其中一個向量 – incBrain

+0

@incBrain:轉置不會改變產生的錯誤。 – David

+0

你確定你正在使用正確的功能嗎? http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.sparse.csr_matrix.html 有趣的是,該文檔頁面沒有餘弦函數,即使存在一個用於正弦和切線等。但格式是'罪'和'譚',讓我覺得你想用'cos()'而不是'cosine()'。你在輸入什麼?有cos和餘弦函數遍佈numpy/scipy和數學軟件包 – kingledion

回答

2

所以問題是,numpy.dot()不知道稀疏矩陣中,每個在這裏:http://docs.scipy.org/doc/scipy/reference/sparse.html

當我運行

>>> scipy.spatial.distance.cosine(a[0], b[0]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.6/site-packages/scipy/spatial/distance.py", line 303, in cosine 
    return (1.0 - (np.dot(u, v.T)/\ 
    File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 287, in __mul__ 
    raise ValueError('dimension mismatch') 
ValueError: dimension mismatch 

的錯誤是在np.dot(),它不理解已經作爲參數傳遞的csr_matrix對象。這可以通過固定:

>>> scipy.spatial.distance.cosine(a[0].toarray(), b[0].toarray()) 
array([[ 0.10197349]]) 

顯然不是你要找的答案,通過轉換爲你失去的性能優勢密集排列,但至少這是什麼原因造成您的問題。

+0

似乎我可以通過'csr_matrix' api中的'.multiply()'方法自己計算自己來解決'cosine()'問題。你的解決方案也可以,所以我會標記爲正確的。 – David