基于地域和热度的推荐算法

下面以新闻为例说明热度算法的基本原理。
在一则新闻录入数据库后, 初始化一个热度分(S0), 此时该新闻就进入了新闻推荐的候选池。

(1) 随着新闻不断被用户点击 (click) 、转发 (share) 、关注 (follow) 、评论 (comment) 、 点赞 (up) 等, 对应的和用户交互维度的热度 (S1) 不断增加。

**(2)**另外, 新闻要求具有时效性, 因此在新闻发布后, 热度(S2)会随着时间衰减。随着时间的后移,新闻的热度不断发生变化,对应的推荐抽选池排序也在不断地发生变化.

最终新闻热度对应的计算公式为:

S=S0+S1-S2

实际情况下, 需要考虑的因素还有很多, 但这里遵循的原则是: 正向的因素做加法, 负向的因素做减法。

但这里有三个问题:

1. 新闻的初始热度应该不一致

在上式中, 为每一条入库的新闻赋予了相同的初始化热度, 但这并不符合实际情况,因为:
(1) 不同类别的新闻本身的社会传播度不同, 如娱乐类的新闻更容易被大众所接受。
(2) 不同时期, 人们对新闻的需求程度也不同。 例如, 在新的 iPhone 发布时, 和 iPhone相关的新闻热度就比较大;在奥运会期间, 和体育相关的新闻热度就比较大。

因此, 在初始化新闻的初始热度时需要考虑以下两点:
(1)不同类别的新闻初始热度权重应该不同。 至于每种类别的新闻的权重应该是多少, 可以对历史数据进行统计, 进而得出相应的比例。 最终的结果应该类似下图所示的权重分布 (图中比例仅做举例使用)。


不同类别新闻对应的权重分布

(2)不同时间段的热门新闻应该有不同的初始权重。 在新闻进入推荐候选池时, 进行人工审核, 如果是热点新闻则赋予较大的权重。 另外一种做法是一维护一个热点词库: 当新发表新闻时, 与热点词库进行匹配, 匹配度越高则初始化的热度值就越大。


2. 用户的行为规则应该发生变化

用户与新闻的交互是导致新闻热度增加的最主要因素, 常见交互行为有点击(click)、转发(share)、关注(follow)、评论(comment)、 点赞(up)。这里认为所 列出的5种行为均对提高新闻的热度值具有正向作用。 如果给它们都赋予相同的权重, 则S2的表达式为:

S2 = 0.2 × click + 0.2 × share + 0.2 × follow + 0.2 × comment + 0.2 × up

但在实际情况中, 不同行为所表达的用户对新闻的偏好程度并不一致。 直观地理解, 它们的占比大小是:

评论>转发>关注>点赞>点击 。

按照比例给不同的交互行为赋予不同的权重, 改进的S2计算公式如下:

S2 = 0.05 × click + 0.3 × share + 0.15 × follow + 0.4 × comment + 0.
I × up


3.热度随时间衰减的趋势非线性

新闻具有实效性, 已经发布的新闻的热度会随着时间的流逝而衰减, 并且趋势是衰减得越来越快, 直到热度趋于0。 由此可以想到, 如果一条新闻要持续出现在推荐列表靠前的位置,则必须有越来越多的用户进行交互。

结合牛顿冷却定律, 新闻热度随时间的衰减是一个类似千指数增长的过程,公式如下式中,:

t0为新闻的发布时间, t1 为当前计算排序时的时间。

但考虑到新闻的热度最终是趋于0的, 所以将上式改为:

--------------------------------------------进入正题---------------------------------------

创建一个基于地域和热度的酒店推荐系统

在基于地域和热度的酒店推荐中,并不对用户的偏好进行区分,而是根据用户的位置信息, 结合不同的排序方式, 将用户位置附近的酒店推荐给用户。

北京部分酒店数据(注意数据形式)

这里选择的是某网站上北京的部分酒店数据, 数据获取方式为爬虫爬取。 酒店信息包含: 酒店名字、 所在地区、 具体地址、 评论数目、 评分、 电话号码、 装修时间、 开业时间、 最低价格


基于地域和热度的酒店推荐系统实现思路如下:

(1) 加载并筛选出用户所在地区的数据;
(2) 根据指定的排序规则对数据进行排序;
(3) 将结果返回给用户。

主要实现酒店推荐, 根据用户所在的地区和所选择的排序方式返回相应的前k个酒 店数据。

  • 数据集都取所在地址是北京的, 包含朝阳区、 丰台区、 东城区、 西城区、 海淀区、 顺义 区、 石景山区、 延庆区、 房山区、 通州区
  • 支持排序的字段有:评论数目、装修时间、开业时间、评分、最低价格,以及综合排序。
  • 程序中通过type字段进行赋值。
  • 排序方式分为升序和降序。

第一种:自定义排序,用户根据可选择的排序字段,返回前k个或者后k个值的排序,返回酒店名字和查看的字段排序后的k个值。

第二种:综合排序

“综合排序” 是对其余排序字段的线性整合。这里简单地定义了各个排序字段的权重,通过线性相加的方式计算出最后的总得分, 然后根据这个得分对酒店进行排序。

  1. 对“装修时间” 和 “开业时间” 做了差值处理。这里认为装修时间越久, 对最终的排 序越起到负向作用, 所以, 使用装修时间减去 2018 得到一个负值。 同理, 认为开业时间越久对 最终的排序越起到正向作用, 所以使用 2018 减去开业时间得到一个正值。
  2. 对参与计算的各个字段做归一化处理, 采用的是 min-max 归一化。
  3. 得到最终的 “ 综合排序” 的计算公式为:

Score= 1× 评分+2×评论数目+ 3× 装修时间+ 4× 开业时间+ 5× 最低价格

#代码思路:import pandas
class RecomendHotel:def __init__(self,path=None,address=None, type=['score'],k=10,sort=False):self.path = pathself.address = addressself.type = typeself.k= kself.sort = sortself.data = self.hotel_mess()def hotel_mess(self):data =pd.read_csv(self.path,header=0,sep=",",encoding='GBK')return data[data["addr"]==self.address]def recomend(self):data = self.data[['name',"score","comment_num","lowest_price","decoration_time","open_time"]]   #取出需要的字段if self.type in data.columns.tolist():   #判断用户需要查看的指标判断酒店data = data.sort_values([self.type,"lowest_price"],ascending=self.sort)[:self.k]   #根据用户输入的判断字段可以进行排序return dict(data.filter(items=["name",self.type]).values)   #返回酒店名字和排序后的字段else:if self.type=='combine':    #用户选择综合评分#过滤使用的信息data = self.data.filter(items=["name","score","comment_num","decoration_time","open_time","lowest_price"])#对装修时间做处理data['decoration_time'] = data['decoration_time'].apply(lambda x: int(x)-2021)#对开店时间做处理data['open_time'] = data['open_time'].apply(lambda x: 2021 - int(x))#数据归一化for col in data.columns.tolist():if col != 'name':data[col] = (data[col] - data[col].min()) / (data[col].max() - data[col].min())# 给予:评分的权重为1,评论数目权重为2,装修和开业时间权重为0.5,最低价权重为1.5#给予不同的字段的权重,并将分数赋给combine综合字段data[self.type]=1 * data["score"] + 2 * data["comment_num"] + \3 * data["decoration_time"] + 4 * data["open_time"] + 5 * data["lowest_price"]   data = data.sort_values(by=self.type, ascending=self.sort)[:self.k]return dict(data.filter(items=['name',self.type]).values)   #返回综合评分的酒店名字和排序if __name__ == '__main__':recomendhotel = RecomendHotel(path = 'hotel-mess.csv',address='东城区',type = 'combine',k=10)print(recomendhotel.recomend())
{'北京保利大厦': 8.928710269200643, '北京新侨诺富特饭店': 7.794049593059157, '北京航招宾馆(原中航第一招待所)': 7.061409778511543, '北京华侨大厦': 6.959724357099342, '北京励骏酒店': 6.866169144869108, '国瑞百捷酒店(北京站崇文门店)': 6.628174603174602, '北京黄河京都大酒店': 6.270450726817961, '如家精选酒店(北京朝阳门地铁站店)': 6.0280423280423285, '鑫海锦江大酒店': 6.006402414685075, '北京贝尔特酒店': 5.8860641874390485}
``

基于地域和热度的推荐算法,以较为简单的例子来看相关推荐

  1. 协同过滤算法_基于用户的协同过滤推荐算法原理和实现

    (给算法爱好者加星标,修炼编程内功) 来源:Create Chen's Blog https://www.cnblogs.com/technology/p/4467895.html 在推荐系统众多方法 ...

  2. 基于项目的协同过滤推荐算法单机版代码实现(包含输出电影-用户评分矩阵模型、项目相似度、推荐结果、平均绝对误差MAE)

    基于项目的协同过滤推荐算法单机版代码实现(包含输出电影-用户评分矩阵模型.项目相似度.推荐结果.平均绝对误差MAE) 一.开发工具及使用技术 MyEclipse10.jdk1.7.movielens数 ...

  3. python协同过滤可以预测吗_基于用户的协同过滤推荐算法原理-附python代码实现...

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  4. 基于用户的协同过滤推荐算法原理和实现

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  5. 基于用户的协同过滤推荐算法原理和实现分析

    本文转载自nieson  基于用户的协同过滤推荐算法原理和实现 在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 ...

  6. (一)基于用户的协同过滤推荐算法原理和实现

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  7. 详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法

    详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法 TF-IDF的基本原理 算法思想 计算公式 相似度计算原理 微型图书推荐案例 案例背景 开发工具 数据预处理 TF-IDF模型建 ...

  8. mysql数据推荐算法_Java+Mysql实现简单在线电影、音乐、图书推荐系统 基于用户的协同过滤推荐算法实现 源代码下载...

    # Java+Mysql实现简单在线电影.音乐.图书等推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,tomca ...

  9. 基于用户行为特征的推荐算法

    简述:基于用户行为分析的推荐算法是个性化推荐系统的重要算法,也被称为协同过滤算法,即通过用户与网站不断互动,来不断过滤自己感兴趣的物品. 基础概念 用户行为分类 按照反馈的明确性分 显性反馈行为: 用 ...

最新文章

  1. BZOJ1202: [HNOI2005]狡猾的商人
  2. C++自动生成的成员函数
  3. [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串...
  4. python编程图片_python下载百度图片,python图片下载程序
  5. Bind 配置非递归服务器
  6. Java 的 IO 很复杂?用思路带领你去battle他!
  7. 【推荐】你必须知道的EF知识和经验
  8. mysql开启binlog启动慢_mysql配置开启binlog与慢查询日志功能
  9. 图的储存方式,链式前向星最简单实现方式 (边集数组)
  10. SAP License:SAP项目上线的时间选择
  11. Effective_STL 学习笔记(二十六) 尽量使用 iterator 代替 const_iterator,reverse_iterator和const_reverse_iterator...
  12. uniapp开发关于视频播放器适配H5的全屏(横屏)操作
  13. linux如何把系统盘转换成gpt,如何更改/转换Ubuntu MBR驱动器到GPT,并从EFI启动Ubuntu?...
  14. 抖音自媒体是如何赚钱的,怎么做才能挣到更多的钱?
  15. 游戏数值策划入门介绍
  16. 优雅地封装和使用 ViewBinding,该替代 Kotlin synthetic 和 ButterKnife 了
  17. 通信端口感叹号_PCI简易通讯控制器有黄色感叹号怎么办?
  18. Python采集最热影评 + 制作词云图
  19. 单页应用html5答题问卷,问卷调查:巧用问卷网功能,提高答卷质量
  20. 上海2017QCon个人分享总结

热门文章

  1. 优先队列(最小优先队列)
  2. 互联网进化断代史第零纪--奇点纪
  3. 集线器、交换机和路由器通俗点的解释
  4. idea的索引和配置文件
  5. ubuntu新系统设置
  6. 没文化不可怕,可怕的是没文化还像我一样矫情
  7. 你永远无法靠讲逻辑道理来说服人
  8. 靶机渗透—unknowndevice64
  9. 鸿蒙系统怎么还不能更新,为什么还更新不了鸿蒙_为什么不能更新鸿蒙系统
  10. oracle 11.2.0.4 mos,Oracle 11.2.0.4 最终版本发布以来的 Oracle PSU 列表