协同过滤算法之基于物品的推荐算法

目前有关个性化推荐算法主要分为三大类:1.基于协同过滤的推荐;2.基于内容过滤的推荐和3.社会化推荐。

本文主要讨论基于协同过滤的推荐,而该算法也可以划分为两类:

1.基于用户的协同过滤算法(UserCF)

该算法利用用户之间的相似性来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。但有很难解决的两个问题,一个是稀疏性,即在系统使用初期由于系统资源还未获得足够多的评价,很难利用这些评价来发现相似的用户。另一个是可扩展性,随着系统用户和资源的增多,系统的性能会越来越差。

2.基于物品的协同过滤算法(ItemCF)

内容过滤根据信息资源与用户兴趣的相似性来推荐商品,通过计算用户兴趣模型和商品特征向量之间的向量相似性,主动将相似度高的商品发送给该模型的客户。由于每个客户都独立操作,拥有独立的特征向量,不需要考虑别的用户的兴趣,不存在评价级别多少的问题,能推荐新的项目或者是冷门的项目。这些优点使得基于内容过滤的推荐系统不受冷启动和稀疏问题的影响

数据描述

#用户,兴趣度,物品

uid_score_bid = ['A,1,a', 'A,1,b', 'A,1,d', 'B,1,b', 'B,1,c', 'B,1,e', 'C,1,c', 'C,1,d', 'D,1,b', 'D,1,c', 'D,1,d',

'E,1,a', 'E,1,d']

1.构建用户-->物品的倒排

def loadData(files):

data ={};

for line in files:

user,score,item=line.split(",");

data.setdefault(user,{});

data[user][item]=score;

print "----1.用户:物品的倒排----"

print data

return data

#2.计算

# 2.1 构造物品-->物品的共现矩阵

# 2.2 计算物品与物品的相似矩阵

def similarity(data):

# 2.1 构造物品:物品的共现矩阵

N={};#喜欢物品i的总人数

C={};#喜欢物品i也喜欢物品j的人数

for user,item in data.items():

for i,score in item.items():

N.setdefault(i,0);

N[i]+=1;

C.setdefault(i,{});

for j,scores in item.items():

if j not in i:

C[i].setdefault(j,0);

C[i][j]+=1;

print "---2.构造的共现矩阵---"

print ('N:',N);

print ('C',C);

#2.2 计算物品与物品的相似矩阵

W={};

for i,item in C.items():

W.setdefault(i,{});

for j,item2 in item.items():

W[i].setdefault(j,0);

W[i][j]=C[i][j]/sqrt(N[i]*N[j]);

print "---3.构造的相似矩阵---"

print W

return W

#3.根据用户的历史记录,给用户推荐物品

def recommandList(data,W,user,k=3,N=10):

rank={};

for i,score in data[user].items():#获得用户user历史记录,如A用户的历史记录为{'a': '1', 'b': '1', 'd': '1'}

for j,w in sorted(W[i].items(),key=operator.itemgetter(1),reverse=True)[0:k]:#获得与物品i相似的k个物品

if j not in data[user].keys():#该相似的物品不在用户user的记录里

rank.setdefault(j,0);

rank[j]+=float(score) * w;

print "---4.推荐----"

print sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N];

return sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N];

if __name__=='__main__':

#用户,兴趣度,物品

uid_score_bid = ['A,1,a', 'A,1,b', 'A,1,d', 'B,1,b', 'B,1,c', 'B,1,e', 'C,1,c', 'C,1,d', 'D,1,b', 'D,1,c', 'D,1,d',

'E,1,a', 'E,1,d'];

data=loadData(uid_score_bid);#获得数据

W=similarity(data);#计算物品相似矩阵

recommandList(data,W,'A',3,10);#推荐

django -- 推荐商品算法的更多相关文章

  1. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为 ...

  2. Vue框架H5商城类项目商品详情点击返回弹出推荐商品弹窗的实现方案

    需求场景: 非推荐商品详情页返回的时候弹出弹窗推荐商品,点击弹窗按钮可以直接访问推荐商品: 只有直接进入商品详情页返回才会弹出推荐商品弹窗: 每个用户访问只能弹一次(除非清除缓存). 需求分析: 1. ...

  3. PHP拼多多模式,砍价免费拿商品算法

      我12年开始做网站,对拼多多关注两三年了,一直对他们的拉新模式很感兴趣,下面我对砍价送礼品的算法跟大家分享下. 拼多多砍价免费拿商品有几个核心的东西: 1.需要拉新多人给商品,这个是直接在数据库配 ...

  4. EcShop首页显示特定分类的精品新品热销特价等推荐商品

    EcShop首页显示特定分类的精品新品热销特价等推荐商品 很多大型的B2C商城都有特定分类专区,该分类下的[分类名称].[推荐子分类 或 推荐品牌].[大图片/推荐单品].[推荐商品].[促销商品]. ...

  5. 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...

  6. ecshop 商品详情页显示同类别下的推荐商品

    1.打开goods.php文件找到下面代码 $smarty->assign('goods_rank', get_goods_rank($goods_id)); // 商品的销售排名 在上面的代码 ...

  7. 05-06 Flutter JSON和序列化反序列化、创建模型类转换Json数据、轮播图数据渲染:Flutter创建商品数据模型 、请求Api接口渲染热门商品 推荐商品

    Config.dart class Config{ static String domain='http://jd.itying.com/'; } FocusModel.dart class Focu ...

  8. django之分页算法实现(Paginator)

    导入模块:from django.core.paginator import Paginator 一.Paginator的基本用法: from django.core.paginator import ...

  9. django 百度分页算法

    效果如下: 脚本: 1. 脚本结构 2.pagination.py from django.utils.safestring import mark_safe class Page: ''' curr ...

随机推荐

  1. (转)C# 快速高效率复制对象的方式

    1.需求 在项目代码中经常需要把对象复制到新的对象中,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } pu ...

  2. Select2异步搜索数据

    $('#countryID').select2( { placeholder: "请选择国家", ajax: { dataType: 'json', type: 'POST', d ...

  3. .net MVC使用Session验证用户登录(转载)

    .net MVC使用Session验证用户登录   用最简单的Session方式记录用户登录状态 1.添加DefaultController控制器,重写OnActionExecuting方法,每次访问 ...

  4. elasticsearch6.7 05. Document APIs(5)Delete By Query API

    4.Delete By Query API _delete_by_query API可以删除某个匹配条件的文档: POST twitter/_delete_by_query { "query ...

  5. 【Spring】15、spring mvc路径匹配原则

    Ant path 匹配原则 在Spring MVC中经常要用到拦截器,在配置需要要拦截的路径时经常用到<mvc:mapping/>子标签,其有一个path属性,它就是用来指定需要拦截的路径 ...

  6. Linux常用基本命令:三剑客命令之-awk内置变量与自定义变量

    AWK中,变量分为两种:内置变量与自定义变量. 常见的内置变量有: FS:输入字段分隔符, 默认为空白字符 OFS:输出字段分隔符, 默认为空白字符 RS:输入记录分隔符(输入换行符), 指定输入时的 ...

  7. 自定义jq插件,鼠标悬浮展示图片或者视频放大图,可自定义展示内容

    网站项目经常会遇到一些视频或者图片素材的展示功能,那么就需要自己写一个功能,就是在一些列表页面你想要是这个数据的详细内容,弹框在页面某个位置 例如这是视频悬浮展示效果,可自定义自动播放等属性标签 又例 ...

  8. Hadoop shell命令

    1.FS Shell 调用文件系统(FS)shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI格式是scheme: ...

  9. js 复制文本到粘贴板

    //html 在iOS Safari中,剪贴板API有一些限制(实际上是安全措施):   于安全原因,iOS Safari只允许容器中的document.execCommand('copy')文本co ...

  10. 【备忘】SQL语句增加字段、修改字段、修改类型、修改默认值

    一.修改字段默认值 alter table 表名 drop constraint 约束名字 ------说明:删除表的字段的原有约束 alter table 表名 add constraint 约束名 ...