SlopOne推荐算法
2015-06-03 18:41
381 查看
在开源框架taste中有SlopOne的Java实现,效果不错。使用movielens的数据,代码如下
代码
#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()
相关文章推荐
- linux的IP配置方法
- 让Apache支持ASP.NET
- linux查看端口号是否被占用
- nginx 重写 rewrite 基础及实例
- tomcat部署项目 以及 如何去掉项目名称
- linux 命令之 tar
- linux下tar命令详解
- Android开发环境部署—— Eclipse+NDK for Android JNI 的开发环境(linux 环境)
- 使用crontab,让linux定时执行shell脚本【crontab -e】
- tomcat源码阅读(一)——环境搭建
- nginx的upstream目前支持5种方式的分配
- 系统架构设计理论与原则、负载均衡及高可用系统设计速记
- android从网站获取json接口数据并放置到spinner
- Linux下常用的C/C++开源Socket库
- Linux下常用的C/C++开源Socket库
- WordPress 主题制作常用函数
- Linux内核线程的建立
- pip 安装psycopg的错误
- Linux C++程序Segmentation fault错误的处理方法。
- sudo:无法解析主机 解决方案