2013-08-25 28 views
5

Ho i dati in un file nella forma seguente:come creare una matrice di similarità in python numpy?

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

Quindi, la matrice voglio formare per i dati di cui sopra è la seguente:

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

in cui i dati mancanti viene sostituito da 0.

Ma da questo voglio creare sia la matrice di similarità da utente a utente che la matrice di somiglianza articolo a elemento?

Come faccio?

risposta

4

Tecnicamente, questo non è un problema di programmazione ma un problema di matematica. Ma penso che sia meglio usare la matrice varianza-covarianza. O matrice di correlazione, se la scala dei valori sono molto diversi, per esempio, invece di avere:

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

Hai:

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

Per ottenere una matrice varianza-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.  ]]) 

O la matrice di correlazione:

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

Questo è il modo di guardarlo, la cella diagonale, cioè, (0,0) cella, è la correlazione del tuo 1 ° vettore in X a sé stesso, quindi è 1. Le altre celle, cioè, (0,1) cella, è la correlazione tra il 1 ° e il 2 ° vettore in X. Sono correlati negativamente. O allo stesso modo, la prima e la terza cellula sono positivamente correlate.

matrice di covarianza o matrice di correlazione evitare il problema zero indicato da @Akavall.

+1

Penso che l'approccio alla covarianza sia migliore della mia soluzione. – Akavall

Problemi correlati