2017-01-28 2 views
1

Пусть у меня есть Numpy матрица вроде следующего:создать косинус подобия матрицы NumPy

array([array([ 0.0072427 , 0.00669255, 0.00785213, 0.00845336, 0.01042869]), 
    array([ 0.00710799, 0.00668831, 0.00772334, 0.00777796, 0.01049965]), 
    array([ 0.00741872, 0.00650899, 0.00772273, 0.00729002, 0.00919407]), 
    array([ 0.00717589, 0.00627021, 0.0069514 , 0.0079332 , 0.01069545]), 
    array([ 0.00617369, 0.00590539, 0.00738468, 0.00761699, 0.00886915])], dtype=object) 

Как я могу генерировать матрицу 5 х 5, где каждый индекс матрицы является косинус сходство двух соответствующих строк в моей оригинальная матрица?

например. значение строки 0 столбца 2 было бы сходством косинусов между строкой 1 и строкой 3 в исходной матрице.

Вот что я пробовал:

from sklearn.metrics import pairwise_distances 
from scipy.spatial.distance import cosine 
import numpy as np 

#features is a column in my artist_meta data frame 
#where each value is a numpy array of 5 floating point values, similar to the 
#form of the matrix referenced above but larger in volume 

items_mat = np.array(artist_meta['features'].values) 

dist_out = 1-pairwise_distances(items_mat, metric="cosine") 

Приведенный выше код дает мне следующее сообщение об ошибке:

ValueError: настройка элемента массива с последовательностью.

Не знаете, почему я получаю это, потому что каждый массив имеет одинаковую длину (5), которую я проверил.

+0

Что вы пробовали? Покажите нам свой код. – DyZ

+0

'1-pairwise_distances (f, metric =" cosine ")' делает именно то, что вам нужно, предполагая, что 'f' является исходным массивом в верхней части вашего сообщения. Может быть проблема с содержимым 'items_mat'. Можете ли вы показать первые, скажем, 5x5 элементов? – DyZ

+0

Конечно - матрица в исходном посте была обновлена, чтобы отразить первые пять строк той, которую я вычисляю. Даже при вычислении сходства косинуса первых пяти строк я сталкиваюсь с ошибкой. – Sal

ответ

1

позволяют m быть массив

m = np.array([ 
     [ 0.0072427 , 0.00669255, 0.00785213, 0.00845336, 0.01042869], 
     [ 0.00710799, 0.00668831, 0.00772334, 0.00777796, 0.01049965], 
     [ 0.00741872, 0.00650899, 0.00772273, 0.00729002, 0.00919407], 
     [ 0.00717589, 0.00627021, 0.0069514 , 0.0079332 , 0.01069545], 
     [ 0.00617369, 0.00590539, 0.00738468, 0.00761699, 0.00886915] 
    ]) 

per wikipedia: Cosine_Similarity
enter image description here

Мы можем вычислить наш числитель с

d = m.T @ m 

Наша ‖A‖ является

norm = (m * m).sum(0, keepdims=True) ** .5 

Тогда сходство

d/norm/norm.T 

[[ 1.  0.9994 0.9979 0.9973 0.9977] 
[ 0.9994 1.  0.9993 0.9985 0.9981] 
[ 0.9979 0.9993 1.  0.998 0.9958] 
[ 0.9973 0.9985 0.998 1.  0.9985] 
[ 0.9977 0.9981 0.9958 0.9985 1. ]] 

Расстояния

1 - d/norm/norm.T 

[[ 0.  0.0006 0.0021 0.0027 0.0023] 
[ 0.0006 0.  0.0007 0.0015 0.0019] 
[ 0.0021 0.0007 0.  0.002 0.0042] 
[ 0.0027 0.0015 0.002 0.  0.0015] 
[ 0.0023 0.0019 0.0042 0.0015 0. ]] 
0

Пусть x будет ваш массив

from scipy.spatial.distance import cosine 

m, n = x.shape 
distances = np.zeros((m,n)) 
for i in range(m): 
    for j in range(n): 
     distances[i,j] = cosine(x[i,:],x[:,j]) 
Смежные вопросы