热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

推荐系统基于用户的协同过滤算法

1.概述和搜索引擎一样,推荐系统是为了帮助人们更快速的获得对自己有用的信息。和搜索引擎不同,推荐系统是人们被动的获取,由系统根据用户行为或

1.         概述

和搜索引擎一样,推荐系统是为了帮助人们更快速的获得对自己有用的信息。

和搜索引擎不同,推荐系统是人们被动的获取,由系统根据用户行为或其他的信息推荐给用户的,儿搜索引擎是用户主动输入关键字获取的。

从某种意义上说,搜索引擎和推荐系统是互相补充的。

而推荐算法的本质是通过一定的方式将用户和物品联系起来,从而有效的给用户推荐本身感兴趣或需要但是没有发现的物品。

个性化推荐系统的应用场景:电子商务(据说Amazon 35%的销售额来自推荐系统)、电影和视频网站、个性化音乐网络电台、社交网络、个性化阅读、基于位置的服务、个性化邮件、个性化广告(上下文广告、搜索广告、个性化展示广告)。

 

         一个推荐系统的评判标准:用户满意度、预测准确度、覆盖率、多样性、新颖性、惊喜度、信任度、实时性、健壮性、商业目标。

2.        主要推荐系统算法

基于邻域的方法、隐语义模型、基于图的随机游走算法。在这些方法中,最著名、在业界得到最广泛应用的算法是基于邻域的方法。

基于邻域的方法主要包括:基于用户的协同过滤算法(给用户推荐和他兴趣相似的其他用户喜欢的物品)和基于物品的协同过滤算法(给用户推荐和该用户喜欢的物品属性类似的其他物品)

下面主要说明一下第一种算法

基于用户的协同过滤算法

该算法的主要步骤:1、找到与该用户兴趣相似的用户集;2、找到这个集合中的用户喜欢的但是没有听说过的物品推荐给目标用户。

第一步:计算用户的兴趣相似度

可以通过以下公式计算:

其中u,v表示两个用户,N(u)表示用户u曾经有过正反馈的物品集合;N(v)表示用户v曾经有过正反馈的物品集合。

算法的Python实现如下:


def User_Similarity(train):W=dict()for u in train.keys():for v in train.keys():if u == v: continue; W[u][v] = len(train[u],train[v])W[u][v] /= math.sqrt(len(train[u]) * len(train[v]) * 1.0)



可以发现该代码的时间复杂度是O(n*n),并且大多数用户的兴趣相似度可能位0,即|N(u)∩N(v)| = 0,所以该代码还是可以优化的。

我们可以先计算出|N(u)∩N(v)| ≠ 0的用户对(u,v)然后除以余弦相似度。这里可以使用倒排,将数据排列成物品到用户的倒排表,物品后链接的是与对该物品感兴趣的用户链表,然后循环统计每个物品用户链表的用户相似度即可。

算法的Python代码如下:

#!/usr/bin/env python
# coding=utf-8
def UserSimilarity(train):#建立倒排表item_users = dict()for u,items in train.items():for i in item.keys():if i not in item_users:items_users[i] = set()item_users[i].add(u)#item_users即为物品到用户的倒排表#计算用户之间的相关度C = dict()#任意用户之间的相关度N = dict()#用户正反馈物品的数目for i ,users in item_users:for u in users:N[u] += 1for v in users:if u == v:continue:C[u][v] += 1#最后计算结果矩阵W = dict()for u ,related_users in C.items():for v,cuv in related_users:W[u][v] = cuv / math.sqrt(N[u]* N[v]*1.0)
return W



 

 

物品-用户倒排表

第二步:推荐和他相似的K个用户喜欢的物品

其中:p(u,i)用户u对物品i的兴趣度;

S(u,K)包含和用户u兴趣最相近的K的用户;

Wuv用户u和用户v的兴趣相似度;

Rvi用户v对物品i的兴趣度;

 

算法的Python代码实现:

def Recommend(user,train,W):rank = dict()interacted_items = train[user]for v , wuv in sort(W[u].items,key = itemgetter(1),reverse = True)[0:k]:for i ,rvi in train[v].items:if i in interacted_items:continuerank[i] += wuv * rvireturn rank





转载于:https://my.oschina.net/xinger/blog/265689


推荐阅读
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
mobiledu2502883785
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有