SlopOne推荐算法(附Python源码)

Posted 机器学习算法与Python学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()  




投稿、商业合作

请发邮件到:357062955@qq.com

更多精彩请阅读原文


以上是关于SlopOne推荐算法(附Python源码)的主要内容,如果未能解决你的问题,请参考以下文章

量化交易都会用到什么Python库?推荐哪些书籍

机器学习推荐算法(附例题代码)

JavaWeb SSM 《精品毕设》基于移动端的新闻推荐系统(Python推荐算法) 前台 + 后台(源码 + 论文)主要实现的登录注册主页推荐算法推荐文章热度用户推荐文章推荐等

Python爬虫提速小技巧,多线程与多进程(附源码示例)

附源码基于知识图谱的智能推荐系统-Sylvie小兔

推荐一款完整的互联网商城管理系统(附源码)