2013-08-25 10 views
5

Mam dane w pliku w postaci:jak stworzyć macierz podobieństwa w numpy python?

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

Tak, matryca chcę tworzyć dla powyższych danych jest następujący:

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

gdzie brakuje danych jest zastąpiona przez 0.

Ale z tego chcę utworzyć zarówno macierz podobieństwa użytkownika do użytkownika, jak i macierz podobieństwa elementu do elementu?

Jak to zrobić?

Odpowiedz

4

Technicznie nie jest to problem programistyczny, ale problem matematyczny. Ale myślę, że lepiej użyć macierzy wariancji-kowariancji. Lub macierz korelacji, jeśli skala wartości są bardzo różne, powiedzmy, zamiast:

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

Masz:

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

Aby uzyskać macierz wariancji-CoV:

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

Lub macierz korelacji:

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

To jest sposób patrzenia na to, komórka przekątna, czyli komórka o przekątnej, czyli (0,0), jest korelacją twojego pierwszego wektora w X z jej własnym, więc jest to 1. Pozostałe komórki, tj. Komórka (0,1), to korelacja pomiędzy 1. i 2. wektor w X. Są ujemnie skorelowane. Lub podobnie, pierwsza i trzecia komórka są dodatnio skorelowane.

macierz kowariancji lub macierz korelacji unikają problemu zero wskazanego przez @Akavall.

+1

Myślę, że podejście kowariancji jest lepsze niż moje rozwiązanie. – Akavall

Powiązane problemy