>백엔드 개발 >파이썬 튜토리얼 >Python으로 구현된 협업 필터링 추천 알고리즘에 대한 자세한 설명

Python으로 구현된 협업 필터링 추천 알고리즘에 대한 자세한 설명

小云云
小云云원래의
2018-05-30 09:18:3510278검색

다른 데이터와 다른 프로그래머는 서로 다른 협업 필터링 추천 알고리즘을 작성하지만 핵심은 동일합니다. 이 기사에서는 주로 Python으로 구현된 협업 필터링 추천 알고리즘의 전체 코드 예제를 소개하며, 이는 특정 참조 가치가 있습니다. 그것. . 그것이 모두에게 도움이 되기를 바랍니다.

테스트 데이터

http://grouplens.org/datasets/movielens/

협업 필터링 추천 알고리즘은 주로 다음과 같이 나뉩니다.

1. 주변 사용자를 기반으로 현재 사용자가 선호하지 않는 항목을 예측하고, 항목을 기준으로 정렬된 추천 항목 목록을 계산합니다. 사용자가 항목 A를 좋아하고 항목 C도 좋아한다면 항목 A와 항목 C가 매우 유사하다는 것을 알 수 있고 사용자 C가 항목 A를 좋아한다면 사용자 C도 항목 C를 좋아할 것이라고 추론할 수 있습니다.

서로 다른 데이터와 프로그래머가 서로 다른 협업 필터링 추천 알고리즘을 작성하지만 핵심은 동일합니다.

1. 사용자 선호도 수집

1) 서로 다른 행동을 그룹화

2) 서로 다른 그룹에 대해 가중치 계산 수행 사용자의 전체 선호도

3) 데이터 노이즈 제거 및 정규화

2. 유사한 사용자(사용자 기준) 또는 항목(항목 기준) 찾기

3. 유사성을 기준으로 사용자 추천

이 예제 프로세스:

1. 데이터 초기화

영화 및 평점 가져오기

데이터로 변환 userDict는 특정 사용자의 모든 영화에 대한 평점 집합을 나타내며 평점을 5로 나눕니다.

데이터로 변환 ItemUser는 특정 영화 평가에 참여한 모든 사용자의 집합을 나타냅니다.

2. 모든 사용자와 userId 간의 유사성을 계산합니다.

userId와 교차하는 영화를 시청하는 모든 사용자를 찾습니다.

이 사용자를 반복합니다. userId와의 유사성을 계산하세요

사용자 A와 userId의 합집합을 구하세요. 형식은 {'영화 ID', [A 사용자 등급, userId 등급]}이며 등급은 0으로 기록되지 않습니다.

A 사용자와 userId 사이의 코사인 거리를 계산합니다. 클수록 유사합니다

3. 유사성 기반

4. 출력 추천 목록 및 정확성

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from numpy import *
import time
from texttable import Texttable
class CF:
  def __init__(self, movies, ratings, k=5, n=10):
    self.movies = movies
    self.ratings = ratings
    # 邻居个数
    self.k = k
    # 推荐个数
    self.n = n
    # 用户对电影的评分
    # 数据格式{'UserID:用户ID':[(MovieID:电影ID,Rating:用户对电影的评星)]}
    self.userDict = {}
    # 对某电影评分的用户
    # 数据格式:{'MovieID:电影ID',[UserID:用户ID]}
    # {'1',[1,2,3..],...}
    self.ItemUser = {}
    # 邻居的信息
    self.neighbors = []
    # 推荐列表
    self.recommandList = []
    self.cost = 0.0

  # 基于用户的推荐
  # 根据对电影的评分计算用户之间的相似度
  def recommendByUser(self, userId):
    self.formatRate()
    # 推荐个数 等于 本身评分电影个数,用户计算准确率
    self.n = len(self.userDict[userId])
    self.getNearestNeighbor(userId)
    self.getrecommandList(userId)
    self.getPrecision(userId)

  # 获取推荐列表
  def getrecommandList(self, userId):
    self.recommandList = []
    # 建立推荐字典
    recommandDict = {}
    for neighbor in self.neighbors:
      movies = self.userDict[neighbor[1]]
      for movie in movies:
        if(movie[0] in recommandDict):
          recommandDict[movie[0]] += neighbor[0]
        else:
          recommandDict[movie[0]] = neighbor[0]

    # 建立推荐列表
    for key in recommandDict:
      self.recommandList.append([recommandDict[key], key])
    self.recommandList.sort(reverse=True)
    self.recommandList = self.recommandList[:self.n]

  # 将ratings转换为userDict和ItemUser
  def formatRate(self):
    self.userDict = {}
    self.ItemUser = {}
    for i in self.ratings:
      # 评分最高为5 除以5 进行数据归一化
      temp = (i[1], float(i[2]) / 5)
      # 计算userDict {'1':[(1,5),(2,5)...],'2':[...]...}
      if(i[0] in self.userDict):
        self.userDict[i[0]].append(temp)
      else:
        self.userDict[i[0]] = [temp]
      # 计算ItemUser {'1',[1,2,3..],...}
      if(i[1] in self.ItemUser):
        self.ItemUser[i[1]].append(i[0])
      else:
        self.ItemUser[i[1]] = [i[0]]

  # 找到某用户的相邻用户
  def getNearestNeighbor(self, userId):
    neighbors = []
    self.neighbors = []
    # 获取userId评分的电影都有那些用户也评过分
    for i in self.userDict[userId]:
      for j in self.ItemUser[i[0]]:
        if(j != userId and j not in neighbors):
          neighbors.append(j)
    # 计算这些用户与userId的相似度并排序
    for i in neighbors:
      dist = self.getCost(userId, i)
      self.neighbors.append([dist, i])
    # 排序默认是升序,reverse=True表示降序
    self.neighbors.sort(reverse=True)
    self.neighbors = self.neighbors[:self.k]

  # 格式化userDict数据
  def formatuserDict(self, userId, l):
    user = {}
    for i in self.userDict[userId]:
      user[i[0]] = [i[1], 0]
    for j in self.userDict[l]:
      if(j[0] not in user):
        user[j[0]] = [0, j[1]]
      else:
        user[j[0]][1] = j[1]
    return user

  # 计算余弦距离
  def getCost(self, userId, l):
    # 获取用户userId和l评分电影的并集
    # {'电影ID':[userId的评分,l的评分]} 没有评分为0
    user = self.formatuserDict(userId, l)
    x = 0.0
    y = 0.0
    z = 0.0
    for k, v in user.items():
      x += float(v[0]) * float(v[0])
      y += float(v[1]) * float(v[1])
      z += float(v[0]) * float(v[1])
    if(z == 0.0):
      return 0
    return z / sqrt(x * y)

  # 推荐的准确率
  def getPrecision(self, userId):
    user = [i[0] for i in self.userDict[userId]]
    recommand = [i[1] for i in self.recommandList]
    count = 0.0
    if(len(user) >= len(recommand)):
      for i in recommand:
        if(i in user):
          count += 1.0
      self.cost = count / len(recommand)
    else:
      for i in user:
        if(i in recommand):
          count += 1.0
      self.cost = count / len(user)

  # 显示推荐列表
  def showTable(self):
    neighbors_id = [i[1] for i in self.neighbors]
    table = Texttable()
    table.set_deco(Texttable.HEADER)
    table.set_cols_dtype(["t", "t", "t", "t"])
    table.set_cols_align(["l", "l", "l", "l"])
    rows = []
    rows.append([u"movie ID", u"Name", u"release", u"from userID"])
    for item in self.recommandList:
      fromID = []
      for i in self.movies:
        if i[0] == item[1]:
          movie = i
          break
      for i in self.ItemUser[item[1]]:
        if i in neighbors_id:
          fromID.append(i)
      movie.append(fromID)
      rows.append(movie)
    table.add_rows(rows)
    print(table.draw())
# 获取数据
def readFile(filename):
  files = open(filename, "r", encoding="utf-8")
  # 如果读取不成功试一下
  # files = open(filename, "r", encoding="iso-8859-15")
  data = []
  for line in files.readlines():
    item = line.strip().split("::")
    data.append(item)
  return data

# -------------------------开始-------------------------------
start = time.clock()
movies = readFile("/home/hadoop/Python/CF/movies.dat")
ratings = readFile("/home/hadoop/Python/CF/ratings.dat")
demo = CF(movies, ratings, k=20)
demo.recommendByUser("100")
print("推荐列表为:")
demo.showTable()
print("处理的数据为%d条" % (len(demo.ratings)))
print("准确率: %.2f %%" % (demo.cost * 100))
end = time.clock()
print("耗费时间: %f s" % (end - start))

Summary

위 내용은 Python으로 구현된 협업 필터링 추천 알고리즘의 전체 코드 예제에 대한 내용입니다. 모두에게 도움이 되십시오.

관련 권장 사항:


php+mysql 공동 필터링 알고리즘 구현

협력 필터링

Python에서 공동 필터링 구현에 대한 자습서

위 내용은 Python으로 구현된 협업 필터링 추천 알고리즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.