SlopOne推荐算法(附Python源码)

关键字全网搜索最新排名

【机器学习算法】:排名第一

【机器学习】:排名第二

【Python】:排名第三

【算法】:排名第四

SlopOne是一个非常简单的协同过滤算法。他的基本思想非常简单,如果用户u已经对物品j打过分,现在对物品i进行打分,那么只需要计算出同时对物品i和物品j打分的用户中他们分数之差的平均,那么我们就可以根据这个分数之差来计算用户u对物品i的打分了,当然,这样的物品j也有很多歌,有的物品和j共同大份的用户比较少,有的比较多,那么显而易见的是共同打分多的那个物品在评分是所占的比重应该大一些。举个例子,如下图所示

现在要预测Lucy对Item1的评分。首先可以知道用户Lucy对Item2和Item3打过分,现在计算Item1和Item2的平均差值,即((5-3)+(3-4))/2 = 0.5,在计算Item1和Item3的平均差值,即5-2 = 3,那么根据Item1和Item2的平均差值来看Lucy对Item1的评分可能为2+0.5 = 2.5,同时根据Item1和Item3的平均差值Lucy对Item1的评分可能为5+3=8,最终用户Lucy对Item1的评分为(2.5*2+8*1)/(2+1)=13/3=4.33。

使用movielens数据

链接:https://grouplens.org/datasets/movielens/

Python代码如下

#coding:utf-8  
import re  
import math  
#读取数据,并生成矩阵  
def getMatrix():  
    mat = {}  
    f = open("u.data", "r")  
    for line in f:  
        list = map(int, line.strip("\n").split("\t"))  
        if list[0] in mat:  
            mat[ list[0] ][ list[1] ] = list[2]  
        else:  
            mat[ list[0] ] = { list[1] : list[2] }  
    f.close()  
    return mat  
#计算某个用户的平均分  
def getAvg(usr):  
    res = 0.0  
    for i in usr:  
        res += usr[i]  
    return res / len(usr)  
#预测分数, 返回矩阵mat中用户usr对item的评分  
def getSlopOne(mat, user, item):  
    #用户user的所有item的列表  
    list = mat[user]  
   #分子  
    mole = 0.0  
    #分母  
    demo = 0.0  
    #对于每一个物品,都计算它和物品item的差值,最终算出相对它item的score  
    for it in list:  
        diff_sum = 0.0  
        user_num = 0  
        for us in mat:  
            us_it = mat[us]  
            #如果该user同时评价过这两个item,则采纳他的评分  
            if item in us_it and it in us_it:  
                diff_sum += us_it[item] - us_it[it]  
                user_num += 1  
        #如果item被人评价过  
        if user_num:  
            diff_avg = diff_sum / user_num  
            mole += (list[it] + diff_avg) * user_num  
            demo += user_num  
    #如果没有人评价过,则取这个人的平均分  
    if user_num == 0:  
        return getAvg(list)  
    #否则返回最终的score  
    return mole / demo  
def main():  
    mat = getMatrix()  
    rf = open("u.data", "r")  
    wf = open("o.data", "w")  
    for line in rf:  
        list = map(int, line.strip("\n").split("\t"))  
        score = getSlopOne(mat, list[0], list[1])  
        output = str(list[0]) + "\t" + str(list[1]) + "\t" + str(list[2]) + "\t" + str(score) + "\n"  
        wf.write(output)  
    rf.close()  
    wf.close()  
if __name__ == "__main__":  
    main()  

原文发布于微信公众号 - 机器学习算法与Python学习(guodongwei1991)

原文发表时间:2017-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机视觉life

【深度相机系列二】深度相机原理揭秘--飞行时间(TOF)

深度相机按照深度测量原理不同,一般分为:飞行时间法、结构光法、双目立体视觉法。本文就来说一说飞行时间法。 飞行时间是从Time of Flight直译过来...

692100
来自专栏AI2ML人工智能to机器学习

R语言和表数据分析

最近几年, 对于表数据分析有一些常见的问题, 譬如: 缺失值(Missing), 奇异值(Outlier)(参考 “一个奇异值的江湖 -- 经典统计观” 和 “...

8710
来自专栏灯塔大数据

前沿 | 想让照片里的美女“回头”?清华MIT谷歌用AI帮你实现了

设计师们总是接到这种神奇的需求,但是受限于素材和工具的“想象力”,设计师无法凭空推理出背影女子的正脸是美女还是恐龙,这种需求根本无法达成。不过,AI似乎把这个问...

14460
来自专栏量子位

超火的漫画线稿上色AI出新版了!无监督训练,效果更美好 | 代码+Demo

夏乙 安妮 编译整理 量子位 出品 | 公众号 QbitAI 给喜欢的动漫形象建个了收藏夹,里面收集她的各种图片……懂,谁没几个喜欢的动漫萌妹呢。 一些手绘线稿...

39730
来自专栏新智元

最高比Mask-RCNN快3倍!上交大实时姿态估计AlphaPose升级

今年2月,上海交通大学卢策吾团队MVIG实验室AlphaPose 系统上线,是首个在 COCO 数据集上可达到 70+ mAP 的开源姿态估计系统。本次更新,在...

85140
来自专栏量子位

“深度学习已死,可微编程万岁!”LeCun老师为何又语出惊人?

夏乙 编译整理 量子位 出品 | 公众号 QbitAI ? Deep Learning est mort. Vive Differentiable Progra...

37550
来自专栏AI研习社

丧尸目标检测:和你分享 Python 非极大值抑制方法运行得飞快的秘诀

你知道的,昨晚在我在看《行尸走肉》时,不是享受僵尸野蛮和被迫吃人,或引人入胜的故事情节,我只想建立一个目标检测系统来对僵尸进行识别。

8710
来自专栏新智元

【干货】爆款最新机器学习论文,揭秘黑盒子模型

近年来,许多准确的决策支持系统被构建为黑盒子,即向用户隐藏其内部逻辑的系统。缺乏解释性既是实际问题,也是道德问题。这篇综述文献报道了许多旨在克服这一至关重要弱点...

13030
来自专栏新智元

AI当“暖男”:给裸照自动穿上比基尼

【新智元导读】AI可以用来鉴黄,但有时会把含裸女的古典名画过滤掉。巴西的一组研究人员在JICNN上展示了一种新方法,使用生成对抗网络,给女性裸体照“穿上”比基尼...

14420
来自专栏思影科技

语言网络的短期迅速重组

来自德国马克斯普朗克研究所(Max Planck Institute,Germany)的Gesa Hartwigsen等人在eLIFE期刊上发表了一片文章,研究...

30980

扫码关注云+社区

领取腾讯云代金券