协同过滤代码--getRating.py文件

#coding=utf-8

from math import sqrt
from loadMovieLens import loadMovieLensTrain
from loadMovieLens import loadMovieLensTest

### 计算pearson相关度
def sim_pearson(prefer, person1, person2):
    sim = {}
    #查找双方都评价过的项
    for item in prefer[person1]:
        if item in prefer[person2]:
            sim[item] = 1           #将相同项添加到字典sim中
    #元素个数
    n = len(sim)
    if len(sim)==0:
        return -1

    # 所有偏好之和
    sum1 = sum([prefer[person1][item] for item in sim])
    sum2 = sum([prefer[person2][item] for item in sim])  

    #求平方和
    sum1Sq = sum( [pow(prefer[person1][item] ,2) for item in sim] )
    sum2Sq = sum( [pow(prefer[person2][item] ,2) for item in sim] )

    #求乘积之和 ∑XiYi
    sumMulti = sum([prefer[person1][item]*prefer[person2][item] for item in sim])

    num1 = sumMulti - (sum1*sum2/n)
    num2 = sqrt( (sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
    if num2==0:                                                ### 如果分母为0,本处将返回0.
        return 0  

    result = num1/num2
    return result

### 获取对item评分的K个最相似用户(K默认20)
def topKMatches(prefer, person, itemId, k=20, sim = sim_pearson):
    userSet = []
    scores = []
    users = []
    #找出所有prefer中评价过Item的用户,存入userSet
    for user in prefer:
        if itemId in prefer[user]:
            userSet.append(user)
    #计算相似性
    scores = [(sim(prefer, person, other),other) for other in userSet if other!=person]

    #按相似度排序
    scores.sort()
    scores.reverse()

    if len(scores)<=k:       #如果小于k,只选择这些做推荐。
        for item in scores:
            users.append(item[1])  #提取每项的userId
        return users
    else:                   #如果>k,截取k个用户
        kscore = scores[0:k]
        for item in kscore:
            users.append(item[1])  #提取每项的userId
        return users               #返回K个最相似用户的ID

### 计算用户的平均评分
def getAverage(prefer, userId):
    count = 0
    sum = 0
    for item in prefer[userId]:
        sum = sum + prefer[userId][item]
        count = count+1
    return sum/count

### 平均加权策略,预测userId对itemId的评分
def getRating(prefer1, userId, itemId, knumber=20,similarity=sim_pearson):
    sim = 0.0
    averageOther =0.0
    jiaquanAverage = 0.0
    simSums = 0.0
    #获取K近邻用户(评过分的用户集)
    users = topKMatches(prefer1, userId, itemId, k=knumber, sim = sim_pearson)

    #获取userId 的平均值
    averageOfUser = getAverage(prefer1, userId)     

    #计算每个用户的加权,预测
    for other in users:
        sim = similarity(prefer1, userId, other)    #计算比较其他用户的相似度
        averageOther = getAverage(prefer1, other)   #其他用户的平均分
        # 累加
        simSums += abs(sim)    #取绝对值
        jiaquanAverage +=  (prefer1[other][itemId]-averageOther)*sim   #累加,一些值为负

    # simSums为0,即该项目尚未被其他用户评分,这里的处理方法:返回用户平均分
    if simSums==0:
        return averageOfUser
    else:
        return (averageOfUser + jiaquanAverage/simSums)  

##==================================================================
##     getAllUserRating(): 获取所有用户的预测评分,存放到fileResult中
##
## 参数:fileTrain,fileTest 是训练文件和对应的测试文件,fileResult为结果文件
##     similarity是相似度度量方法,默认是皮尔森。
##==================================================================
def getAllUserRating(fileTrain=‘u1.base‘, fileTest=‘u1.test‘, fileResult=‘result.txt‘, similarity=sim_pearson):
    prefer1 = loadMovieLensTrain(fileTrain)         # 加载训练集
    prefer2 = loadMovieLensTest(fileTest)           # 加载测试集
    inAllnum = 0

    file = open(fileResult, ‘a‘)
    file.write("%s\n"%("------------------------------------------------------"))

    for userid in prefer2:             #test集中每个用户
        for item in prefer2[userid]:   #对于test集合中每一个项目用base数据集,CF预测评分
            rating = getRating(prefer1, userid, item, 20)   #基于训练集预测用户评分(用户数目<=K)
            file.write(‘%s\t%s\t%s\n‘%(userid, item, rating))
            inAllnum = inAllnum +1
    file.close()
    print("-------------Completed!!-----------",inAllnum)

############    主程序   ##############
if __name__ == "__main__":
    print("\n--------------推荐系统 运行中... -----------\n")
    getAllUserRating(‘u1.base‘, ‘u1.test‘, ‘result.txt‘)
时间: 2024-10-26 15:07:07

协同过滤代码--getRating.py文件的相关文章

协同过滤代码---loadMovieLens.py文件

#coding=utf-8 import sys import os ##================================== # 加载指定的训练集文件 # 参数fileName 代表某个训练集文件 ##================================== def loadMovieLensTrain(fileName='u1.base'): str1 = './movielens/' # 目录的相对地址 prefer = {} for line in open(

PyQt4转换ui为py文件需添加如下代码才可执行

1)转换ui为py 命令行进入ui文件所在文件夹,输入pyuic4 ui_name.ui > py_name.py即可 或新建ui2py.bat文件,写入: @echo off @cd /d "%~dp0" pyuic4 %1 > %~n1.py 将ui文件拖入批处理即可,生成在ui文件所在目录,文件名为py_name.py 2)转换后的py文件还不能运行,需要可视化操作才可运行 具体见帖:http://www.cnblogs.com/doudongchun/p/36947

ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路

2017年2月19日, 星期日 ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第二步:构建用户的得分矩阵 第三步:同现矩阵*评分矩阵 第四步:拿到最终结果,排序,得到给用户的推荐列表 问题一:物品同现矩阵和用户得分矩阵如何构建? 问题二:矩阵相乘如何来做?   六个MapReduce step1_第一个MapReduce: 目的-->去重去除数据

代码编译与反编译 (.py文件与.pyc文件互转)

# 将.py文件转化为.pyc文件,实现代码隐藏的需要,转化后的.pyc文件将在当前目录的__pycache__文件夹下. # .pyc文件的使用与.py文件的使用相同. .py -> .pyc import compileall compileall.compile_dir(folder path) .pyc -> .py # 安装 uncompyle pip install uncompyle # 把 name.pyc 反编译成 name.py uncompyle6 name.pyc &g

协同过滤介绍和简单推荐系统的实现

本文引自http://blog.csdn.net/database_zbye/article/details/8664516 本文介绍推荐系统.协同过滤思想,两种基本的相似度衡量,并用python实现.最后就MovieLens数据集上作出简单的推荐. 一.相关知识 (1)推荐系统 如今,推荐系统已经在多方面得到应用,例如淘宝.当当.亚马逊等网站的商品推荐.而个性化推荐系统则是通过发掘用户的兴趣爱好,作出针对性的推荐.个性化推荐的方法较多,最常用的是协同过滤方法,而本文主要讲的也是基于协同过滤的个

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

协同过滤之ALS

搜索推荐,主要有以下几种形式:一.根据人口统计学推荐:此推荐方式需要建立用户模型,并且需要获取用户的具体信息,然后根据矩阵运算,计算相似度,此方式最大缺陷是获取用户的隐私,应用不多: 二.基于内容的推荐:根据特定用户的历史数据,推荐出相似的产品.缺点是需要建立item model,比较费时. 三.基于协同过滤,是目前搜索推荐中应用最广泛的,不需要建立item model,省事,效果比较好.协同过滤的本质,可以概括为"物以类聚,人以群分",分别指基于物品的协同过滤和基于user的协同过滤

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个

基于协同过滤的推荐引擎(实战部分)

基于协同过滤的推荐引擎(理论部分) 时隔十日,终于决心把它写出来.大多数实验都是3.29日做的,结合3.29日写的日记完成了这篇实战. 数据集准备 数据集使用上篇提到的Movielens电影评分数据里的ml-latest-small数据集,下载完成后有下面四个csv文件. 我们这里只需要ratings.csv就够了,打开以后会发现长这样: 是的,它果然和数据库里的没两样,上篇我们介绍的一般评分估计也好,神奇的SVD评分估计也好,前提都是有一个长成下面这样的物品-用户矩阵 然后提出其中的两列,传给