2015-10-16 3 views
2

Возьмите две матрицы, arr1, arr2 размера mxn и pxn соответственно. Я пытаюсь найти расстояние для косинусов их уважаемых строк как матрицу 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)) 

Я думаю, это должно быть возвращающим матрицу MXN с записями в [-1.0, 1.0], но по какой-то причине я получаю значение из этого интервала. Я думаю, что моя одна из этих функций numpy делает что-то другое, чем то, что я думаю.

+1

Если p отличается от n, то строки arr1 и arr2 не совпадают с lentgh. Как вы можете вычислить их внутренний продукт в этом случае? –

+0

@ М. Массиас сожалел о том, что был m на n и p на n. Они должны иметь одинаковое количество столбцов. –

ответ

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 ]])