上周我们介绍了我理解的推荐系统,主要分两种,个性化的和非个性化的。个性化好理解,千人千面,根据用户行为和浏览记录去生成你的推荐。非个性化呢,一般存在于最流行的东西,比如基金中“最多人买”的模块。一般来说,如果商品量不多,是没有必要做个性化推荐的,只有当商品量过多,发生了信息过载的现象,才有使用个性化推荐的必要。

那我们今天介绍最基本的——基于临域的个性化推荐,也被称为协同过滤。

(几乎全部取材于《推荐系统实践》,想学习推荐系统的都建议看一下这本书)

目录

UserCF

itemCF

如何优化效果

基于movielen的usercf的代码

两种方式大同小异,都是通过用户行为去判断用户与用户的相似度或物品与物品的相似度。所以被称为基于临域的。

1.UserCF

首先我们来看这样一个图片,A,B,C,D是用户,abcde是物品,那usercf是基于用户的协同过滤,就是通过它的行为记录中的物品去计算用户的相似度,我们才用余弦相似度的公式。

那就可以算出AB,AC,AD的用户相似度

可是如果是这样计算,要算每两个用户的相似度,复杂度是O(u2),会耽误计算时间。可是很多用户没有对相同的物品有过行为,分子为0的时候我们就没必要计算分母了,所以我们可以优化一下,先计算物品与用户的倒排表,在转化成用户表,具体如图:

倒排表的建立是看物品被哪个用户使用,以物品为中心,这样的话,我们在建立一个大小为U2的矩阵,存储着用户使用的相同物品的个数。这样的话,分子就直接求出来了,分母为用户使用过的物品个数。

那我们现在知道了用户的相似度,如何做推荐呢?

以用户A举例,他用过abd,没用过的是ce。那如果我们只能推荐一个物品,就是计算出A对c,e的兴趣度。c被B,D用过,那我们就用AB的用户相似度*B对c物品的兴趣度加上AD的用户相似度*D对c物品的兴趣度,有点绕,这里用笔在纸上花几个圈就理解了,文字不如图表来的实在。通用公式如下:

其中,p(u,i)表示用户u对物品i的感兴趣程度,S(u,k)表示和用户u兴趣最接近的K个用户,N(i)表示对物品i有过行为的用户集合,Wuv表示用户u和用户v的兴趣相似度,Rvi表示用户v对物品i的兴趣(这里简化,所有的Rvi都等于1)。

其实就是人以群分,相似的人爱相似的东西。

把我们就算出A对c的兴趣度和A对e的兴趣度,这就是最简单的Usercf。

2.itemcf

itemcf是计算物品与物品的相似度。公式与usercf的很像。

其中,|N(i)|是喜欢物品i的用户数,|N(j)|是喜欢物品j的用户数,|N(i)^N(j)|是同时喜欢物品i和物品j的用户数。

最终也是得到物品与物品被同一个人使用的个数的矩阵。不过这个方式也是要计算物品——用户的倒排表的。这样可以直接看出物品被那些人使用。

这样的话,就像上面一样计算出物品的相似度。

推荐时,因为物品的相似度已经有了。比如我们给A做推荐,他用过abd,没用过的是ce,他对c的兴趣度就是他对a的兴趣度*物品ac的相似度+他对b的兴趣度*物品bc的相似度+他对d的兴趣度*物品dc的相似度,公式和上面也很像。

其中,Puj表示用户u对物品j的兴趣,N(u)表示用户喜欢的物品集合(i是该用户喜欢的某一个物品),S(i,k)表示和物品i最相似的K个物品集合(j是这个集合中的某一个物品),Wji表示物品j和物品i的相似度,Rui表示用户u对物品i的兴趣(这里简化Rui都等于1)。

该公式的含义是:和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。

如何优化推荐的效果呢:

1.如果有时间戳的记录的话,我们可以加入时间的因素。在分母中加入一个log(time),这样的话近期的用户行为对推荐的影响大,也是符合逻辑的。

2.如果有评分,我们之前提到的Rui也就是用户对物品的兴趣度,也可以不做简化,而是采用评分的转化,比如分数范围为0~5,那5分对应1的兴趣度,这是最简单的方式,我们可以自定义兴趣度的算法。

3.对于不够热门的商品,可能很难被推荐到。那为了挖掘长尾分布,我们可以对热门商品做惩罚,加入一个惩罚因子,在分母中加入log(热门商品被使用数)。

我们以这样的行为记录举例:

userid是用户ID,movieid是电影ID,rating是评分,timestamp是时间戳

(时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数,比如 1260759144 就可以转换成2009-12-14 10:52:24)

userId movieId rating timestamp

1 31 2.5 1260759144

1 1029 3 1260759179

1 1061 3 1260759182

usercf的代码如下:

(代码在过github上也有,以后会多发布推荐系统的代码

#! /usr/bin/env python

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

#time:2018/2/9 ____author____= pengxiaoxin

import pandas as pd

import numpy as np

import math

from operator import *

rating = pd.read_csv('C:\\Users\\Administrator\\Desktop\\movie-data\\ml-latest-small\\ratings.csv')

#ratings.csv's columns are user,movieId,rating,timestamp

user = rating['userId']

movieId = rating['movieId']

rating1 = rating['rating'] #人对电影的评分

timestamp = rating['timestamp'] #打分的时间

user_item = dict()#构造一个字典,格式{userid:[movieid,movieid],……}因为一个人会看多部电影

for i in range(len(user)):

if user[i] not in user_item:

user_item[user[i]] = set()

user_item[user[i]].add(movieId[i])

item_user = dict()#建立物品——用户的倒排表,为了降低表的稀疏性

for i in range(len(user)):

if movieId[i] not in item_user:

item_user[movieId[i]] = set()#set结构可以看成一个不重复的数组

item_user[movieId[i]].add(user[i])

N = dict()#计数,看看每个电影被看了多少次

C = dict()#得出两个物品同时被一个用户看的次数

for i,items in item_user.items():

for item in items:

if item not in N:

N[item] = 0

N[item]+=1

for item2 in items:

if item ==item2:

continue

if (item, item2) not in C:

C[item,item2] = 0

C[item,item2]+=1

w = dict()#通过C(1,2)/N[1]*N[2] 算出系数表,等于把物品的关联程度算出来啦;如果想加上时间的因素,就用log加入

for i ,item in C.items():

w[i[0],i[1]] = C[i[0], i[1]]/math.sqrt(N[i[0]] * N[i[1]] *1.0)

rank = dict()#推荐列表

target_user = 1 #input("write the user you want to recommand:")

train = user_item[target_user]

ralated_item = dict()

for i in w:

if i[0] in train and i[1] not in train:#找出同时出现的两部电影,两部电影有1部被target-user看过

if i[1] not in ralated_item:

ralated_item[i[1]] = 0

ralated_item[i[1]] = w[i[0],i[1]]

print(sorted(ralated_item.items(), key = itemgetter(1), reverse=True)[:10])#打印出前十的。

python电影推荐系统_推荐系统的几种形式(python版)相关推荐

  1. python判断字符串合法,详解Python判定IP地址合法性的三种方法 python中判断一个字符串是否是IP地址...

    html 中 鼠标放在标签上会显示小手状,其它标签在其他标签上,美工给加了一些样式,鼠标放上去也显示小手状.有哪位大手状样式 有什么不懂的前端问题可以去菜鸟驿站.全都是泡沫,只一刹的花火,所谓的友情, ...

  2. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  3. python进阶项目设计_推荐系统进阶:设计和构建推荐系统流程综述(1)

    内容目录推荐系统应用场景概述 为什么需要推荐? 推荐系统的目标? 推荐系统的工作? 推荐系统的基本模型 构建推荐系统的方法 相关参考? 1.推荐系统概述以及它们如何提供有效形式的定向营销 推荐系统 推 ...

  4. go还是python 知乎_知乎用Go替代Python

    说不上哪个语言会比另一个语言更好.只能说某个语言在某个方面处理某些问题更具有优势吧. 大概每个开发人员应该都会认为自己使用的语言是世界最好的语言吧.这都相对来说的.对于每个人应该都是不同的. 众所周知 ...

  5. python 面试问题_值得阅读的30个Python面试问题

    python 面试问题 Interview questions are quite tricky to predict. In most cases, even peoples with great ...

  6. python老师武_跟着廖雪峰老师学python (5)

    若想技术精进,当然得把基础知识打得牢牢的. 廖雪峰的官方网站  python3教程,该网站提供的教程浅显易懂,还附带了讲学视频,非常适合初学者正规入门. 以下是通过廖雪峰python官方网站学习的个人 ...

  7. 怎么学python知乎_你们都是怎么学 Python 的?

    自学确实是比较难得,没有一个好的规划,好的学习路线图,你不会知道自己下一步该怎么办. 今天我就帮你来解决,分享2020年黑马程序员Python学习路线图,包含学习路线图,学习视频,学习工具,你都可以找 ...

  8. 高中生学python培养思维能力_基于培养思维能力的Python语言程序设计教学

    教育信息化 数码世界 P .203 基于培养思维能力的 Python 语言程序设计教学 周蓉   东莞市商业学校 摘要 :Python 语言有着简洁,高效和生态的三大特点,在中职学校引入计算机程序设计 ...

  9. python变量和变量赋值的几种形式

    动态类型的语言 python是动态类型的语言,不需要声明变量的类型. 实际上,python中的变量仅仅只是用来保存一个数据对象的地址.无论是什么数据对象,在内存中创建好数据对象之后,都只是把它的地址保 ...

最新文章

  1. [转]在WPF中自定义控件 UserControl
  2. java soap 头_如何将java头添加到java中的soaprequest
  3. 程序员求职面试三部曲之三:快速适应新的工作环境
  4. 领域驱动DDD原理简介与实践
  5. C++ 11互斥锁的应用(针对于多线程的情况)
  6. C#获取网上图片的宽高代码
  7. priority_queue 优先队列 hdu裸题。
  8. HDU 4280 Island Transport(HLPP板子)题解
  9. GAMES101-讲课极棒的闫令琪老师-个别概念理解
  10. matlab插值实验目的,matlab插值实验报告数学实验.doc
  11. php全局标签,dedecms的全局标签是什么意思
  12. 改变linux 背景修改命令,Linux命令行下更改桌面背景(GNOME环境)
  13. Summary: Rendering Pipeline简单总结一下渲染管线流程图
  14. 「程序员值得一看」| 传说中的“全球公认最健康的作息时间表”
  15. sqlmap工具使用手册
  16. 学习记录573@双重签名与电子交易概述
  17. phpwind database.php,解决phpwind帖子列表显示个数不正确
  18. WDC2106 iOS10新特性及开发者要注意什么
  19. 微信 商店服务器,对比saas小程序,云开发,微信小商店
  20. 计算机为什么检测不到u盘启动项,BIOS如何设置U盘为电脑启动首选项_BIOS设置U盘启动项检测不到处理方法...

热门文章

  1. 第七周PCL学习--点云配准(七)
  2. 各个厂商手机不打印log日志的解决方法
  3. android+apk+不被杀毒软件,大多数APK应用都会被杀毒软件报毒吗?
  4. 华为m2青春版android7,时尚新体验:华为M2青春版
  5. iOS-通俗易懂的微信支付接入和爬坑指南,十分钟轻松搞完
  6. 为什么要用并发编程?
  7. 最全zabbix安装部署
  8. oracle查看服务器的时间,Oracle如何获取系统当前时间等操作实例
  9. windows terminal ssh连接
  10. PandoraBox登录无法后台,出现/usr/lib/lua/luci/dispatcher.lua:461(2021-12-19亲测)