Co-filtrage basé sur l'utilisateur avec python

Dans le prolongement de Implémentation du co-filtrage basé sur les éléments dans MovieLens en utilisant python comme exemple, j'ai essayé le co-filtrage basé sur l'utilisateur.

import numpy as np
import pandas as pd
from  scipy.spatial.distance import cosine
from scipy.stats import pearsonr

df = pd.read_csv('u.data', sep='\t', names=['user_id','item_id', 'rating', 'timestamp'])

shape = (df.max().ix['user_id'], df.max().ix['item_id'])
R = np.zeros(shape) 

for i in df.index:
    row = df.ix[i]
    R[row['user_id'] -1 , row['item_id'] - 1] = row['rating']


class CollaborativeFiltering:
    def fit(self, rating_matrix):
        u_count = rating_matrix.shape[0]

        boolean_matrix = (rating_matrix > 0) * 1
        mean_ratings = [self.evaluated_mean(rating_matrix[i,:]) for i in range(u_count)] # of users

        self.rating_matrix = rating_matrix
        self.rating_matrix_mean =  (boolean_matrix.T * mean_ratings).T
        
    def predict(self, x):
        sims = self.user_similarities(x)
        
        scores = sims.dot(self.rating_matrix - self.rating_matrix_mean)
        norms = np.absolute(sims).dot((self.rating_matrix > 0) * 1)
        x_mean = self.evaluated_mean(x)
        
        p = scores / norms +  x_mean
        
        for i in range(p.size):
            if np.isnan(p[i]):
                p[i] = 0.0
        
        return p
            
    
    def evaluated_mean(self, v):
            ev = v[v > 0]
            if ev.size > 0:
                return np.mean(ev)
            else:
                return 0.
    
    def user_similarities(self, x):
        # n: user counts
        n = self.rating_matrix.shape[0]
        return np.array([similarity(x, self.rating_matrix[i]) for i in range(n)])

    def similarity(self, v1, v2):
        # index of items that non-zero
        idx = np.logical_and(v1 != 0, v2 != 0)

        v1_non_zero = v1[idx]
        v2_non_zero = v2[idx]

        sim = 0.0
        if v1_non_zero.size > 0:
            coef, _ = pearsonr(v1_non_zero, v2_non_zero)
            if not np.isnan(coef):
                sim = coef

        return sim

cf = CollaborativeFiltering()
cf.fit(R)

référence

Algorithme du système de recommandation

Recommended Posts

Co-filtrage basé sur l'utilisateur avec python
Notes pour la mise en œuvre d'un co-filtrage simple en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python
Daily AtCoder # 18 en Python
Modifier les polices en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Lire DXF avec python
Daily AtCoder # 53 en Python
Séquence de touches en Python
Utilisez config.ini avec Python
Daily AtCoder # 33 en Python