2013-08-25 10 views
5

У меня есть данные в файле в следующем виде:Как создать матрицу подобия в numpy python?

user_id, item_id, rating 
1, abc,5 
1, abcd,3 
2, abc, 3 
2, fgh, 5 

Итак, матрица Я хочу, чтобы сформировать для приведенных выше данных заключается в следующем:

# itemd_ids 
# abc abcd fgh 
[[5, 3, 0] # user_id 1 
[3, 0, 5]] # user_id 2 

, где отсутствуют данные заменяются на 0.

Но из этого я хочу создать матрицу подобия подобия пользователя и элемент к матрице подобия элементов?

Как это сделать?

ответ

4

Технически это не проблема программирования, а математическая проблема. Но я думаю, вам лучше использовать дисперсионно-ковариационную матрицу. Или корреляционная матрица, если масштаб значения сильно отличаются, скажем, вместо того, чтобы:

>>> x 
array([[5, 3, 0], 
     [3, 0, 5], 
     [5, 5, 0], 
     [1, 1, 7]]) 

У вас есть:

>>> x 
array([[5, 300, 0], 
     [3, 0, 5], 
     [5, 500, 0], 
     [1, 100, 7]]) 

Чтобы получить матрицу дисперсии-коронавирус:

>>> np.cov(x) 
array([[ 6.33333333, -3.16666667, 6.66666667, -8.  ], 
     [ -3.16666667, 6.33333333, -5.83333333, 7.  ], 
     [ 6.66666667, -5.83333333, 8.33333333, -10.  ], 
     [ -8.  , 7.  , -10.  , 12.  ]]) 

Или корреляционная матрица:

>>> np.corrcoef(x) 
array([[ 1.  , -0.5  , 0.91766294, -0.91766294], 
     [-0.5  , 1.  , -0.80295507, 0.80295507], 
     [ 0.91766294, -0.80295507, 1.  , -1.  ], 
     [-0.91766294, 0.80295507, -1.  , 1.  ]]) 

Это способ взглянуть на него, диагональная ячейка, т. Е. Ячейка (0,0), является корреляцией вашего 1-го вектора в X с ней, поэтому она равна 1. Другие ячейки, то есть ячейка (0,1), является корреляцией между 1-й и 2-й векторы в X. Они отрицательно коррелированы. Или аналогично 1-я и 3-я ячейки положительно коррелируют.

Ковариационная матрица или матрица корреляции исключают нулевую проблему, отмеченную @Akavall.

+1

Я думаю, что ковариационный подход лучше моего решения. – Akavall

3

Смотрите этот вопрос: What's the fastest way in Python to calculate cosine similarity given sparse matrix data?

Having:

A = np.array(
[[0, 1, 0, 0, 1], 
[0, 0, 1, 1, 1], 
[1, 1, 0, 1, 0]]) 

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

Результат в:

array([[ 1.  , 0.40824829, 0.40824829], 
     [ 0.40824829, 1.  , 0.33333333], 
     [ 0.40824829, 0.33333333, 1.  ]]) 

Но это работает для плотной матрицы. Для редких вы должны разработать свое решение.

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