2015-05-10 4 views
1

У меня есть код для вычисления косинуса сходства между двумя матрицами:косинус вычисление подобия между двумя матрицами

def cos_cdist_1(matrix, vector): 
    v = vector.reshape(1, -1) 
    return sp.distance.cdist(matrix, v, 'cosine').reshape(-1) 


def cos_cdist_2(matrix1, matrix2): 
    return sp.distance.cdist(matrix1, matrix2, 'cosine').reshape(-1) 

list1 = [[1,1,1],[1,2,1]] 
list2 = [[1,1,1],[1,2,1]] 

matrix1 = np.asarray(list1) 
matrix2 = np.asarray(list2) 

results = [] 
for vector in matrix2: 
    distance = cos_cdist_1(matrix1,vector) 
    distance = np.asarray(distance) 
    similarity = (1-distance).tolist() 
    results.append(similarity) 


dist_all = cos_cdist_2(matrix1, matrix2) 
results2 = [] 
for item in dist_all: 
    distance_result = np.asarray(item) 
    similarity_result = (1-distance_result).tolist() 
    results2.append(similarity_result) 

results является

[[1.0000000000000002, 0.9428090415820635], 
        [0.9428090415820635, 1.0000000000000002]] 

Однако results2 является [1.0000000000000002, 0.9428090415820635, 0.9428090415820635, 1.0000000000000002]

Мой идеальный результат results, что означает, что результат содержит списки значений сходства, но я хочу сохранить расчет между двумя матрицами вместо вектора и матрицы, любая хорошая идея?

+0

Не могли бы вы нормализовать столбцы матрицы, а затем AB»будет матрица подобия. Используйте np.dot (A, B.T) – Scott

+0

спасибо за ваши комментарии, но я должен держать матрицу такой, какой она есть, так как она имеет другое значение – gladys0313

ответ

4
In [75]: import scipy.spatial as sp 
In [76]: 1 - sp.distance.cdist(matrix1, matrix2, 'cosine') 
Out[76]: 
array([[ 1.  , 0.94280904], 
     [ 0.94280904, 1.  ]]) 

Таким образом, можно устранить for-loops и заменить все это с

results2 = 1 - sp.distance.cdist(matrix1, matrix2, 'cosine') 
+0

ах, спасибо большое! – gladys0313

Смежные вопросы