• 大小: 7KB
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: Python
  • 标签: Python  协同过滤  

资源简介

基于用户最近邻模型的协同过滤算法的Python代码实现,用户相似度用Pearson相关系数进行计算。

资源截图

代码片段和文件信息

#-------------------------------------------------------------------------------
# Name:        PearsonUserNeighCF
# Purpose:     Personalized Recommendation
#
# Author:      Jinkun Wang
# Email:       wangjinkun90@foxmail.com if you have any question about the
#              code please do not hesitate to contact me.
#
# Created:     10/09/2014
# Copyright:   (c) Jinkun Wang 2014
#-------------------------------------------------------------------------------
from math import sqrt
import numpy as np
import matplotlib.pyplot as plt

def loadData():
    trainSet = {}
    testSet = {}
    movieUser = {}
    u2u = {}

    TrainFile = ‘ml-100k/u1.base‘   #指定训练集
    TestFile = ‘ml-100k/u1.test‘    #指定测试集

    #加载训练集,生成电影用户的倒排序表 movieUser
    for line in open(TrainFile):
        (userId itemId rating _) = line.strip().split(‘\t‘)
        trainSet.setdefault(userId{})
        trainSet[userId].setdefault(itemIdfloat(rating))
        movieUser.setdefault(itemId[])
        movieUser[itemId].append(userId.strip())

    #防止测试集有训练集中没有出现过的项目
    item_in_train = []
    for m in movieUser.keys():
        item_in_train.append(m)

    #加载测试集
    for line in open(TestFile):
        (userId itemId rating _) = line.strip().split(‘\t‘)
        testSet.setdefault(userId{})
        testSet[userId].setdefault(itemIdfloat(rating))

    return trainSettestSetmovieUseritem_in_train

#计算一个用户的平均评分
def getAverageRating(user):
    average = (sum(trainSet[user].values()) * 1.0) / len(trainSet[user].keys())
    return average

#计算用户相似度
def UserSimPearson(trainSet):
    userSim = {}
    for u1 in trainSet.keys():
        userSim.setdefault(u1{})
        u1_rated = trainSet[u1].keys()
        for u2 in trainSet.keys():
            userSim[u1].setdefault(u20)
            if u1 != u2:
                u2_rated = trainSet[u2].keys()
                co_rated = list(set(u1_rated).intersection(set(u2_rated)))
                if co_rated == []:
                    userSim[u1][u2] = 0
                else:
                    num = 0     #皮尔逊计算公式的分子部分
                    den1 = 0    #皮尔逊计算公式的分母部分1
                    den2 = 0    #皮尔逊计算公式的分母部分2
                    sigma_u1_m = 0  #计算用户u1对共同评价项目的评分均值
                    sigma_u2_m = 0  #计算用户u2对共同评价项目的评分均值
                    for m in co_rated:
                        sigma_u1_m += trainSet[u1][m]
                        sigma_u2_m += trainSet[u2][m]
                    ave_u1_m = sigma_u1_m / len(co_rated)
                    ave_u2_m = sigma_u2_m / len(co_rated)

                    for m in co_rated:
                        num += (trainSet[u1][m] - ave_u1_m) * (trainSet[u2][m] - ave_u2_m) * 1.0
                        den1 += pow(trainSet[u1][m] - ave_u1_m 2) * 1.0
                        den2 += pow(trainSet[u2][m] - ave_u2_m 2) * 1.0
                    den1 = sqrt(den1)
                    den2 = sqrt(den2)
                    if den1 ==

评论

共有 条评论