2015-10-16 55 views
2

分別取兩個大小爲mxn和pxn的矩陣arr1,arr2。我試圖找到他們尊敬的行的餘弦距離作爲一個mxp矩陣。基本上我想要採用行的成對點積,然後除以每行的規範的外積。兩個矩陣之間的餘弦距離

import numpy as np 
def cosine_distance(arr1, arr2): 
    numerator = np.dot(arr1, arr2.T) 
    denominator = np.outer(
     np.sqrt(np.square(arr1).sum(1)), 
     np.sqrt(np.square(arr2).sum(1))) 
    return np.nan_to_num(np.divide(numerator, denominator)) 

我認爲這應該在[-1.0,1.0]被返回的條目一個m×n矩陣,但由於某種原因我得到的值指出,間隔的。我在想,我這些numpy函數中的一個正在做的事情不是我認爲的那樣。

+1

如果p不同於n,那麼arr1和arr2的行不是相同的lentgh。在這種情況下,你如何計算內部產品? –

+0

@ M.Massias對不起,原來是由n和n的m。他們應該有相同的列數。 –

回答

1

這聽起來像你需要通過你的載體陣列的L2規範外產品來劃分:

arr1.dot(arr2.T)/np.outer(np.linalg.norm(arr1, axis=1), 
          np.linalg.norm(arr2, axis=1)) 

例如

In [4]: arr1 = np.array([[1., -2., 3.], 
         [0., 0.5, 2.], 
         [-1., 1.5, 1.5], 
         [2., -0.5, 0.]]) 

In [5]: arr2 = np.array([[0., -3., 1.], 
         [1.5, 0.25, 1.]]) 

In [6]: arr1.dot(arr2.T)/np.outer(np.linalg.norm(arr1, axis=1), 
            np.linalg.norm(arr2, axis=1)) 
Out[6]: 
array([[ 0.76063883, 0.58737848], 
     [ 0.0766965 , 0.56635211], 
     [-0.40451992, 0.08785611], 
     [ 0.2300895 , 0.7662411 ]])