Notes pour la mise en œuvre d'un co-filtrage simple en Python

À propos de cet article

Écrivons brièvement un algorithme pour le filtrage coopératif en Python Le filtrage coopératif est ce que l'on appelle le mécanisme «les gens qui voient cela voient aussi ce mécanisme».

C'est un algorithme très simple, donc ce n'est pas quelque chose que vous pouvez réellement utiliser pour quoi que ce soit, mais cela peut vous aider à comprendre facilement comment travailler un algorithme de co-filtrage.

Si vous écrivez réellement le code dans cet article, vous comprendrez que la logique de ** "Les gens qui voient cela voient aussi ceci" ** n'est pas si ésotérique dans son concept.

Site utile pour étudier le co-filtrage

Le code utilisé dans cet article est basé sur ce site. Ceux qui savent lire l'anglais peuvent lire le site original.

Voici quelques autres sites utiles pour étudier le concept du système de recommandation. La conférence de Coursera est particulièrement recommandée

Le concept de base du co-filtrage

Pensons à un algorithme qui recommande un film recommandé pour un certain utilisateur A. Ce qui est fait par l'algorithme à ce moment est comme suit en simplification.

étape ① Cet utilisateur et d'autres utilisateurs**Degré de similitude**Calculer
↓
étape② Extrayez un ensemble de films que l'utilisateur A n'a pas encore regardés à partir des films que d'autres utilisateurs ont regardés.
↓
étape③ Renvoyez une liste de films hautement recommandés à partir de ces films.
Dans cette sélection, plus le film est visionné de manière similaire par l'utilisateur, plus le poids est élevé.

Préparation

Installation des packages requis

package.py


from math import sort

Préparation des données

Les données utilisées ici contiennent les films regardés par certains cinéphiles et les résultats de leurs critiques (scores) dans un format de dictionnaire.

dataset.py


dataset={
 'Lisa Rose': {
 'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5,'You, Me and Dupree': 2.5, 'The Night Listener': 3.0
  },
 'Gene Seymour': {
 'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 3.5
  },
 'Michael Phillips': {
 'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0, 'Superman Returns': 3.5, 'The Night Listener': 4.0
  },
 'Claudia Puig': {
 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0, 'You, Me and Dupree': 2.5
  },
 'Mick LaSalle': {
 'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 2.0
  },
 'Jack Matthews': {
 'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5
  },
 'Toby': {
 'Snakes on a Plane':4.5, 'You, Me and Dupree':1.0, 'Superman Returns':4.0
  }
}

"Calcul de la similitude" entre les utilisateurs

Dans le co-filtrage, la «similitude entre les utilisateurs» est d'abord calculée. Le point dans la conception de l'algorithme ici est de savoir comment définir ** "certains utilisateurs sont similaires ou différents" **.

Il existe d'innombrables définitions pour cela, selon les souhaits du concepteur. Ici, nous le définissons comme «plus les utilisateurs attribuent au même film un score similaire» et «plus la similitude est élevée».

Dans ce cas, une fonction qui calcule la similitude entre «utilisateurs (personne1, personne2)» peut être implémentée comme suit.

similarity.py


def get_similairty(person1, person2):
  
  ##Prenez une série de films que les deux ont regardés
  set_person1 = set(dataset[person1].keys())
  set_person2 = set(dataset[person2].keys())
  set_both = set_person1.intersection(set_person2)
  
  if len(set_both)==0: #S'il n'y a pas de film que vous avez vu en commun, définissez la similitude sur 0
    return 0
  
  list_destance = []
  
  for item in set_both:
    #Calculez le carré de la différence entre les points de revue du même film
    #Plus ce nombre est élevé, plus "je n'aime pas ça"=Peut être défini comme "pas similaire"
    distance = pow(dataset[person1][item]-dataset[person2][item], 2) 
    list_destance.append(distance)
  
  return 1/(1+sqrt(sum(list_destance))) #Renvoie un indice inverse de l'inconfort total de chaque film

Ici, les nombres suivants sont définis comme similitude Similitude = 1 / (1 + sqrt (sum (list_destance))) `` ... (1)

Notez que sum (list_destance) est le carré de la distance entre les utilisateurs dans l'espace de notation de la revue. Plus cette distance est grande, plus «similaire» est exprimé, donc (1) indique le degré de «similaire». Lorsque la distance est `0, le degré de similitude est 1, et lorsque la distance est extrêmement grande, le degré de similitude s'approche de 0.

get_similairty('Lisa Rose','Jack Matthews')
0.3405424265831667

Mettre en œuvre une fonction de recommandation

Les idées de conception et de mise en œuvre des recommandations sont écrites dans les commentaires

recomend.py


def get_recommend(person, top_N):
  
  totals = {} ; simSums = {} #Faire une boîte pour mettre le score de recommandation
  
  #Obtenez une liste d'utilisateurs autres que vous-même et activez l'instruction For
  # ->Pour calculer la similitude avec chaque personne et le score de recommandation du film de chaque personne (pas encore vu par la personne)
  list_others = dataset.keys() ; list_others.remove(person)

  for other in list_others:
    #Obtenez une série de films qu'il n'a pas encore vus
    set_other = set(dataset[other]); set_person = set(dataset[person])
    set_new_movie = set_other.difference(set_person)

    #Calculer la similitude entre un utilisateur et la personne(sim est 0~Nombre de 1)
    sim = get_similairty(person, other)
    
    # (Je ne l'ai pas encore vu)Activez l'instruction For dans la liste des films
    for item in set_new_movie:

      # "Note d'évaluation de Similarité x"Est utilisé comme score de niveau de recommandation pour tous les utilisateurs.
      totals.setdefault(item,0)
      totals[item] += dataset[other][item]*sim 

      #Enregistrez également la valeur intégrée de la similitude utilisateur et divisez le score ci-dessus par celui-ci.
      simSums.setdefault(item,0)
      simSums[item] += sim

  rankings = [(total/simSums[item],item) for item,total in totals.items()]
  rankings.sort()
  rankings.reverse()

  return [i[1] for i in rankings][:top_N]

résultat

get_recommend('Toby',2)

['The Night Listener', 'Lady in the Water']

Recommended Posts

Notes pour la mise en œuvre d'un co-filtrage simple en Python
Co-filtrage basé sur l'utilisateur avec python
Implémentation d'un algorithme simple en Python 2
Note de nfc.ContactlessFrontend () de nfcpy de python
Remarques sur l'utilisation de python (pydev) avec eclipse
GRPC simple en Python
Code python de la méthode k-means super simple
Mémo Python Tkinter (pour moi)
Techniques de tri en Python
Implémentons Yuma dans Python 3
Analyse de régression simple avec Python
Serveur HTTP simple pour python
Obtenez des notes Evernote en Python
Client IRC simple avec python
À propos de "for _ in range ():" de python
Un moyen simple d'éviter plusieurs boucles for en Python
Rechercher les fuites de mémoire dans Python
Rechercher des commandes externes avec python
OAuth 2 simple avec Python (urllib + oauthlib)
Notes de grammaire minimales pour écrire Python
Notes personnelles pour le traitement d'images python
Mémo pour moi graphique csv python
Notes pour l'entrée / sortie de fichier Python
Exécutez unittest en Python (pour les débutants)
Exécutez un algorithme simple en Python
Logique gacha simple écrite en Python
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Grattage WEB avec Python (pour mémo personnel)
Un client HTTP simple implémenté en Python
Inject est recommandé pour DDD en Python
Créer une application GUI simple en Python
Conseils pour gérer les binaires en Python
Résumé de diverses instructions for en Python
Tapez les annotations pour Python2 dans les fichiers stub!
Modèle pour l'écriture de scripts batch en python
Traiter plusieurs listes avec for en Python
Ecrire une méthode de cupidité simple en Python
Obtenez un jeton pour conoha avec python
Exemple de gestion des fichiers eml en Python
Fiche de triche AtCoder en python (pour moi-même)
Ecrire un plugin Vim simple en Python 3
J'ai cherché un nombre premier avec python
Conseils pour créer de petits outils avec python
Utilisez pathlib dans Maya (Python2.7) en préparation du prochain Python3.7
Notes pour les débutants en Python ayant de l'expérience dans d'autres langues 12 (+1) éléments par fonction
Tapez des notes sur les scripts Python pour exécuter le modèle PyTorch en C ++ avec libtorch
Résultats potentiels (résultats potentiels) Note d'inférence causale dans Python Partie 1
Modèle pour créer des applications de ligne de commande en Python
Configurer un serveur HTTPS simple avec Python 3
CERTIFICATE_VERIFY_FAILED dans Python 3.6, le programme d'installation officiel de macOS
Étudier les mathématiques avec Python: résoudre des problèmes simples de probabilité
++ et-ne peuvent pas être utilisés pour incrémenter / décrémenter en python
Essayez d'implémenter deux piles en Python sur un seul tableau
Notes personnelles sur le code doc Python dans Sphinx
Ajouter un devis ">" pour répondre aux e-mails en Python3