Benutzerbasierte Co-Filterung mit Python

Als Fortsetzung von Implementieren der objektbasierten Co-Filterung in Python unter Verwendung von MovieLens als Beispiel habe ich die benutzerbasierte Co-Filterung versucht.

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)

Referenz

Algorithmus des Empfehlungssystems

Recommended Posts

Benutzerbasierte Co-Filterung mit Python
Hinweise zur Implementierung einer einfachen Co-Filterung in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python
Täglicher AtCoder # 18 in Python
Bearbeiten Sie Schriftarten in Python
Singleton-Muster in Python
Dateioperationen in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python
Tastenanschlag in Python
Verwenden Sie config.ini mit Python
Täglicher AtCoder # 33 in Python