八大算法python实现_python实现协同过滤推荐算法完整代码示例

测试数据

协同过滤推荐算法主要分为:

1、基于用户。根据相邻用户,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表进行推荐

2、基于物品。如喜欢物品A的用户都喜欢物品C,那么可以知道物品A与物品C的相似度很高,而用户C喜欢物品A,那么可以推断出用户C也可能喜欢物品C。

不同的数据、不同的程序猿写出的协同过滤推荐算法不同,但其核心是一致的:

1、收集用户的偏好

1)不同行为分组

2)不同分组进行加权计算用户的总喜好

3)数据去噪和归一化

2、找到相似用户(基于用户)或者物品(基于物品)

3、计算相似度并进行排序。根据相似度为用户进行推荐

本次实例过程:

1、初始化数据

获取movies和ratings

转换成数据userDict表示某个用户的所有电影的评分集合,并对评分除以5进行归一化

转换成数据ItemUser表示某部电影参与评分的所有用户集合

2、计算所有用户与userId的相似度

找出所有观看电影与userId有交集的用户

对这些用户循环计算与userId的相似度

获取A用户与userId的并集。格式为:{'电影ID',[A用户的评分,userId的评分]},没有评分记为0

计算A用户与userId的余弦距离,越大越相似

3、根据相似度生成推荐电影列表

4、输出推荐列表和准确率

#!/usr/bin/python3

# -*- coding: utf-8 -*-

from numpy import *

import time

from texttable import Texttable

class CF:

def __init__(self, movies, ratings, k=5, n=10):

self.movies = movies

self.ratings = ratings

# 邻居个数

self.k = k

# 推荐个数

self.n = n

# 用户对电影的评分

# 数据格式{'UserID:用户ID':[(MovieID:电影ID,Rating:用户对电影的评星)]}

self.userDict = {}

# 对某电影评分的用户

# 数据格式:{'MovieID:电影ID',[UserID:用户ID]}

# {'1',[1,2,3..],...}

self.ItemUser = {}

# 邻居的信息

self.neighbors = []

# 推荐列表

self.recommandList = []

self.cost = 0.0

# 基于用户的推荐

# 根据对电影的评分计算用户之间的相似度

def recommendByUser(self, userId):

self.formatRate()

# 推荐个数 等于 本身评分电影个数,用户计算准确率

self.n = len(self.userDict[userId])

self.getNearestNeighbor(userId)

self.getrecommandList(userId)

self.getPrecision(userId)

# 获取推荐列表

def getrecommandList(self, userId):

self.recommandList = []

# 建立推荐字典

recommandDict = {}

for neighbor in self.neighbors:

movies = self.userDict[neighbor[1]]

for movie in movies:

if(movie[0] in recommandDict):

recommandDict[movie[0]] += neighbor[0]

else:

recommandDict[movie[0]] = neighbor[0]

# 建立推荐列表

for key in recommandDict:

self.recommandList.append([recommandDict[key], key])

self.recommandList.sort(reverse=True)

self.recommandList = self.recommandList[:self.n]

# 将ratings转换为userDict和ItemUser

def formatRate(self):

self.userDict = {}

self.ItemUser = {}

for i in self.ratings:

# 评分最高为5 除以5 进行数据归一化

temp = (i[1], float(i[2]) / 5)

# 计算userDict {'1':[(1,5),(2,5)...],'2':[...]...}

if(i[0] in self.userDict):

self.userDict[i[0]].append(temp)

else:

self.userDict[i[0]] = [temp]

# 计算ItemUser {'1',[1,2,3..],...}

if(i[1] in self.ItemUser):

self.ItemUser[i[1]].append(i[0])

else:

self.ItemUser[i[1]] = [i[0]]

# 找到某用户的相邻用户

def getNearestNeighbor(self, userId):

neighbors = []

self.neighbors = []

# 获取userId评分的电影都有那些用户也评过分

for i in self.userDict[userId]:

for j in self.ItemUser[i[0]]:

if(j != userId and j not in neighbors):

neighbors.append(j)

# 计算这些用户与userId的相似度并排序

for i in neighbors:

dist = self.getCost(userId, i)

self.neighbors.append([dist, i])

# 排序默认是升序,reverse=True表示降序

self.neighbors.sort(reverse=True)

self.neighbors = self.neighbors[:self.k]

# 格式化userDict数据

def formatuserDict(self, userId, l):

user = {}

for i in self.userDict[userId]:

user[i[0]] = [i[1], 0]

for j in self.userDict[l]:

if(j[0] not in user):

user[j[0]] = [0, j[1]]

else:

user[j[0]][1] = j[1]

return user

# 计算余弦距离

def getCost(self, userId, l):

# 获取用户userId和l评分电影的并集

# {'电影ID':[userId的评分,l的评分]} 没有评分为0

user = self.formatuserDict(userId, l)

x = 0.0

y = 0.0

z = 0.0

for k, v in user.items():

x += float(v[0]) * float(v[0])

y += float(v[1]) * float(v[1])

z += float(v[0]) * float(v[1])

if(z == 0.0):

return 0

return z / sqrt(x * y)

# 推荐的准确率

def getPrecision(self, userId):

user = [i[0] for i in self.userDict[userId]]

recommand = [i[1] for i in self.recommandList]

count = 0.0

if(len(user) >= len(recommand)):

for i in recommand:

if(i in user):

count += 1.0

self.cost = count / len(recommand)

else:

for i in user:

if(i in recommand):

count += 1.0

self.cost = count / len(user)

# 显示推荐列表

def showTable(self):

neighbors_id = [i[1] for i in self.neighbors]

table = Texttable()

table.set_deco(Texttable.HEADER)

table.set_cols_dtype(["t", "t", "t", "t"])

table.set_cols_align(["l", "l", "l", "l"])

rows = []

rows.append([u"movie ID", u"Name", u"release", u"from userID"])

for item in self.recommandList:

fromID = []

for i in self.movies:

if i[0] == item[1]:

movie = i

break

for i in self.ItemUser[item[1]]:

if i in neighbors_id:

fromID.append(i)

movie.append(fromID)

rows.append(movie)

table.add_rows(rows)

print(table.draw())

# 获取数据

def readFile(filename):

files = open(filename, "r", encoding="utf-8")

# 如果读取不成功试一下

# files = open(filename, "r", encoding="iso-8859-15")

data = []

for line in files.readlines():

item = line.strip().split("::")

data.append(item)

return data

# -------------------------开始-------------------------------

start = time.clock()

movies = readFile("/home/hadoop/Python/CF/movies.dat")

ratings = readFile("/home/hadoop/Python/CF/ratings.dat")

demo = CF(movies, ratings, k=20)

demo.recommendByUser("100")

print("推荐列表为:")

demo.showTable()

print("处理的数据为%d条" % (len(demo.ratings)))

print("准确率: %.2f %%" % (demo.cost * 100))

end = time.clock()

print("耗费时间: %f s" % (end - start))

总结

以上就是本文关于python实现协同过滤推荐算法完整代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

一、算法思路1、思路分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,…

python请编写程序、生成随机密码_利用Python如何生成随机密码

本位实例为大家分享了Python生成随机密码的实现过程,供大家参考,具体内容如下写了个程序,主要是用来检测MySQL数据库的空密码和弱密码的,在这里,定义了三类弱密码:1. 连续数字,譬如123456&#…

centos6.5装mysql好难_centos 6.5装mysql5.7

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼报错er-5.7.17-1.el7.i686 需要--> 处理依赖关系 libc.so.6(GLIBC_2.17),它被软件包 mysql-community-server-5.7.17-1.el7.i686 需要--> 完成依赖关系计算错误:Package: mysql-community-client-5.7.…

聚类算法 距离矩阵_谱聚类

比起传统的K-means算法,谱聚类对数据分布的适应性更强,计算量也要小很多。1. 谱聚类概述谱聚类是从图论中演化出来,主要思想是吧所有的数据看作空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低&#…

core mysql 延迟加载_mybatis延迟加载及实例讲解

延迟加载基本概念上面我们已经知道使用association、collection可以实现一对一及一对多映射,association、collection还有另外一个延迟加载的功能。延迟加载(lazy load)是关联对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的&am…

mysql忘记i密码_Mysql忘记密码处理过程

最近项目用到了Mysql,项目里面没有运维人员,项目经理吩咐我在Linux下搭基础环境,其中遇到各种坑,现在记录一下,方便以后使用。以下内容是从网上摘抄过了的,若有侵权,请联系本人删除。1.mysql5.7…

vlan划分不能上网_VLAN工作原理

什么是VLANVLAN(Virtual LAN),翻译成中文是“虚拟局域网”。可以看做是在一个物理局域网络上搭建出几个逻辑上分离的几个局域网。举个例子来说,如果一个交换机划分为两个VLAN,则相当于这台交换机逻辑上划分为两个交换机。VLAN的一个简单直观说…

mysql查询条件是小数 查不到6.28_28.mysql数据库之查询

1.查询语句mysql 多表关系 查询语句 索引1.添加数据补充:将一个查询结果插入到另一张表中create table student(name char(10),gender int);insert into student values("jack",1);insert into student values("rose",0);create table student_man(name ch…

控制for each循环次数_CCF CSP编程题解201312-1:出现次数最多的数

试题编号:201312-1试题名称:出现次数最多的数时间限制:1.0s内存限制:256.0MB问题描述:给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。输入格式:输入的第一行只有一…

python编程优化_掌握六大技巧,让python编程健步如飞!

有人跟我抱怨说python太慢了,然后我就将python健步如飞的六大技巧传授给他,结果让他惊呆了,你也想知道这个秘诀吗?这就告诉你:Python是一门优秀的语言,它能让你在短时间内通过极少量代码就能完成许多操作。不仅如此&a…

python离线安装依赖包_python离线安装外部依赖包的实现

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

python段子_Python爬取内涵段子里的段子

环境:Python3.6#!/usr/bin/env python3#-*-coding:utf-8-*-#version:3.6.4__author__ 杜文涛import requestsimport jsondef get_json_dic(url):global dict_jsonresponse requests.get(urlurl)json_response response.content.decode() #获取r的文本 就是一个js…

r语言中的或怎么表示什么不同_R经典入门 之 R语言的基本原理与概念 -- 200430

一、基本原理R是一种解释型语言,输入的命令可以直接被执行,不同于C等编译语言需要构成完整的程序才能运行。R的语法非常简单和直观。合法的R函数总是带有圆括号的形式,即使括号内没有内容(如,ls())。所有函数后都接有圆括号以区别…

旋流式沉砂池计算_旋流沉砂池设计方法

旋流沉砂池设计接口条件和主要参数设计旋流沉砂池前要确认的接口条件和信息包括:地质、气候等基本设计条件;可用地尺寸及在总图的位置坐标;地坪标高,上下游水位或范围,冻土层高度,管道覆土小深度要求&#…

parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池

线程组线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。构造函数ThreadGroup(String name)//默认parent为当前线程组 ThreadGroup(ThreadGroup parent, String name)具体方法//评估当前活跃的线程数,包括当前group和子g…

java 缓冲流_Java缓冲流的使用

package java;import org.junit.Test;import java.io.*;/*** 处理流之一:缓冲流的使用** 1.缓冲流:* BufferedInputStream* BufferedOutputStream* BufferedReader* BufferedWriter** 2.作用:提供流的读取、写入的速度* 提高读写速度的原因&a…

pytorch l2正则化_吴恩达深度学习 编程作业六 正则化(2)

推荐守门员应该将球踢到哪个位置,才能让自己的队员用头击中。1.无正则化模型判别是否有正则化与调用其他计算函数。准确率:0.948/0.915明显过拟合overfiting了。2.L2正则化公式如下,在原有cost函数基础上增加L2项,L2为参数w的均方…

java 代码锁_Java中的Lock锁

Lock锁介绍:在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景、高效的性能,java还提供了Lock接口及其实现类ReentrantLock和读写锁 ReentrantReadWriteLock。相比synchronized来实现同步,使…

vs中工具箱代表的意思_“日”除了代表太阳,其实还有这种意思,特别是出现在这些词语中的“日”...

对于“日”来说,大家都并不陌生,对于日的成语更是多得数不胜数,今天小编将日字成语进行了一个总结,需要用到的朋友们可以收藏!一:以“日”开头的成语,大多数形容的是时间。日积月累、日久天长、…

java 访问路径_java获取项目访问路径的相关方法

java获取项目访问路径的相关方法刘振兴代码分享2016年02月11日6292暂无评论在jsp和class文件中调用的相对路径不同。在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获…