推荐算法--时效性(05)

时效性

推荐系统应该考虑时间效应,因为用户的兴趣是有时间变化的。用户一年前喜欢的东西现在不一定感兴趣,相比于推荐过去喜欢的物品,推荐用户近期喜欢的物品更有参考价值。而在新闻更是如此,推荐过去跟用户兴趣一致的新闻已经失去了意义。每个系统时间效应的大小不同,比如时间对电影的作用就没有新闻那么明显。要考虑时效性,必须加入时间参数,比如三元组(用户,物品,时间)代替简单的二元组(用户,物品)。给定时间 T ,一般化的时间衰减公式为:


其中  是物品 i 最近的流行度,是时间衰减参数,对于时效性明显的系统,应该越大。代码实现如下:

  1. def RecentPopularity(records, alpha, T):
  2. ret = dict()
  3. for user, item ,tm in records:
  4. if tm > T:
  5. continue
  6. addToDict(ret , item, 1/(1.0 + alpha * (T - tm)))
  7. return ret

时效性的 ItemCF 算法

前面提到的 ItemCF 算法有两个核心组成,(1)物品相似度矩阵(2)基于用户历史行为做推荐

(1)加入时效性考虑,用户在相隔很短的时间内喜欢的物品的相似度应该高于时间跨度比较大的用户喜欢物品之间的相似度。原来的物品相似度公式为:


在得到时间信息(用户对物品产生行为的时间)后,加入时间衰减函数的公式如下:


衰减项中,其中 是用户u 对物品 i 产生行为的时间。f 函数的意义是,用户对物品 i 和物品 j 产生行为的时间越远,则  越小。可以找到很多数学衰减函数,比如


是时间衰减参数,它的取值在不同的系统中不同。系统用户兴趣变化的越快,应该越大。改进后的 ItemCF 算法的物品相似度矩阵计算代码如下所示:

  1. def ItemSimilarity(train, alpha):
  2. #计算 C[i][j] 矩阵
  3. C = dict()
  4. N = dict()
  5. for u,items in train.items():
  6. for i,tui in items.items(): #原来是没有 tui 的
  7. N[i] += 1
  8. for j, tuj in items.items():
  9. if i == j:continue
  10. C[i][j] += 1 / (1 + alpha * abs(tui - tuj))
  11. #计算 W[i][j]
  12. W = dict()
  13. for i, related_items in C.items():
  14. for j, cij in related_items.items():
  15. W[i][j] = cij / math.sqrt(N[i] * N[j])
  16. return W

除了考虑时间对物品相似度的影响,还要考虑时间信息对推荐预测的影响。一般来说,用户最近的喜好应该和用户兴趣关系更大,需要将时间比较久的过去的喜欢的物品加上时间衰减函数。


其中  是现在的时间, 是用户u 对 物品 i 评价过的时间。 代码修改如下:

  1. def Recommendation(train, user_id, W, K,t0):
  2. rank = dict()
  3. ru = train[user_id]
  4. for i,pi in ru.items():
  5. rui, tui = pi
  6. for j, wji in sorted(W[i].items, key = itemgetter(1), reverse = True)[0:K]:
  7. if j in ru.keys():
  8. continue
  9. rank[j] += rui * wji / (1 + beta * (t0 - tui))
  10. return rank

时效性的 UserCF 算法

类似 ItemCF ,UserCF 也有两个核心。(1)计算用户相似度矩阵(2)基于相似用户兴趣做推荐

(1)加入时效性考虑,如果两个用户在比较近的时间里有共同的喜好,则比在不同时间段用户有相同喜好的参考意义更大。回顾原来的用户相似度公式如下:


其中 N(u) 是用户 u 喜欢的物品集合,N(v) 是用户 v 喜欢的物品集合。加入时间衰减因子修正公式如下:


其中  是用户 u 喜欢物品 i 的时间, 是用户 v 喜欢物品 i 的时间。代码如下:

  1. def UserSimilarity(train):
  2. #建立倒排表,比原来多加入了时间信息
  3. item_users = dict()
  4. for u, items in train.items():
  5. for i, tui in items.items():
  6. if i not in item_users:
  7. item_users[i] = dict()
  8. item_users[i][u] = tui
  9. # 计算 C[u][v]
  10. C = dict()
  11. N = dict()
  12. for i, users in item_users.items():
  13. for u,tui in users.items():
  14. N[u] += 1
  15. for v,tvi in user.items():
  16. if u == v:continue
  17. C[u][v] += 1 / (1 + alpha * abs(tui - tvi))
  18. # 计算 W[u][v]
  19. W = dict()
  20. for u, related_users in C.items():
  21. for v,cuv in related_users.items():
  22. W[u][v] = cuv / math.sqrt(N[u] * N[v])
  23. return W

同样地,处了考虑时间信息对用户相似度矩阵的影响,还应该考虑时间信息对推荐算法的影响。找到相似的用户后,认为推荐相似用户近期感兴趣的物品比推荐过去感兴趣的物品更有意义。原来的 UserCF 算法中用户 u 对物品 i 的兴趣公式如下:


加入时间衰减函数后,改进 UserCF 推荐公式如下:


其中 代表现在的时间, 代表相似的用户 v 喜欢物品 i 的时间。改进后的推荐算法代码如下:

  1. def Recommend(user, t0, train, W):
  2. rank = dict()
  3. interacted_items = train[user] # user的已有物品
  4. for v, wuv in sorted(W[user].items, key = itemgetter(1), reverse = True)[0:K]:
  5. for i, pi in train[v].items:
  6. rvi, tvi = pi
  7. if i in interacted_items:continue
  8. rank[i] += wuv * rvi / (1 + alpha * (t0 - tvi))
  9. return rank

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

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

相关文章

初识博弈论(1)

博弈论与主流经济学的新发展1.经济学的研究内容2.博弈论的研究内容3.博弈论的发展简史4.经济学发展的趋势本系列博文主要记录了学习张维迎老师的《博弈论与信息经济学》一书相关内容,如果有误之处恳请指出;或对照张老师的书籍进行学习。1.经济学的研究内…

c语言实现排序和查找所有算法

c语言版排序查找完成,带详细解释,一下看到爽,能直接运行看效果。 /* Note:Your choice is C IDE */ #include "stdio.h" #include"stdlib.h" #define MAX 10 void SequenceSearch(int *fp,int Length); void Search(int …

推荐算法--推荐系统架构(06)

外围架构一般来说,每个网站都有一个 UI 系统,UI 系统负责给用户展示网页并和用户交互。网站会通过日志系统将用户在 UI 上的各种各样的行为记录到用户行为日志中。 从上面的结构可以看到,除了推荐系统本身,主要还依赖两个条件--界…

树状数组维护区间和的模型及其拓广的简单总结

by wyl8899 树状数组的基本知识已经被讲到烂了,我就不多说了,下面直接给出基本操作的代码。 假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组。 #define lowbit(x) ((x)&(-(x))…

Python(6)-算数运算符

算数运算符1.算数运算符2.优先级1.算数运算符 加 减- 乘* 除/ 取商// 取余数% 幂**(能算n次方: 2**38,一直以为只能算平方) 扩展: 乘法用于字符串:字符串重复指定的次数,要拼接的次数很长时,用乘号很方便…

推荐算法--其他信息(07)

文章目录目录1.利用上下文信息1.1时间上下文1.2地点上下文2.利用网络社交数据2.1 获取网络社交数据途径2.2 社交网络数据2.3 基于社交网络的推荐2.4 推荐算法2.5 给用户推荐好友目录 1.利用上下文信息 1.1时间上下文 用户的兴趣是随着时间变化的,三天打鱼两天晒网…

动态规划的深入探讨

一、引言 动态规划是一种重要的程序设计思想,具有广泛的应用价值。使用动态规划思想来设计算法,对于不少问题往往具有高时效,因而,对于能够使用动态规划思想来解决的问题,使用动态规划是比较明智的选择。 能够用动态规…

Python(7)-程序执行的原理

程序执行的原理1.计算机中的三个核心部件2.程序执行的原理3.程序的作用1.计算机中的三个核心部件 CPU:中央处理区,超大规模的集成电路,负责处理数据、计算 内存:临时存储数据,断电数据消失,读取数据快 硬盘…

推荐系统读书笔记(推荐系统实战)

随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载的时代。在这个时代,无论是信息消费者还是信息生产者都遇到很大的挑战;对于消费者,从大量信息中找到自己感兴趣的信息是一件非常困难的事情;对于信…

橙白oj 2017级《算法分析与设计》-练习02

注:A题我以为给新生出的,应该贼简单,是按顺序消灭,卡了十几分钟,成了最后一个ac的题,真是菜的真实。 Problem A: Description 白细胞是人体与疾病斗争的“卫士”。当病菌侵入人体体内时,白细胞…

python(9)-变量、input函数

变量、input函数1.变量的定义(不可变对象)2.变量的类型3.变量的命名规范4. 不同类型的数据计算5.类型转换函数6.input()7.Tips程序是用来处理数据的,而变量是用来存储数据的。 关于函数,是一个提前准备好的代码;可以直接使用,不用…

推荐算法--总结(08)

一、推荐系统结构二、推荐引擎算法(Algorithm)1、协同过滤推荐算法1.1 关系矩阵与矩阵计算1.1.1 用户与用户(U-U矩阵)1.1.2 物品与物品(V-V矩阵)1.1.3 用户与物品(U-V矩阵)1.1.4 奇异…

算法总结-1算法入门

1.0 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 …

Python(10)- 格式化输出%

格式化输出1. 格式化输出浮点数2. 格式化输出整数3. 格式化输出浮点数4. 格式化输出百分号%变量的格式化输出:input函数将信息输出到控制台,实现变量和文字一起输出。 %格式化操作符,和不同的字符连用,%s 字符串,%d 十…

FM系列算法解读(FM+FFM+DeepFM)

在计算广告中,CTR是非常重要的一环。对于特征组合来说,业界通用的做法主要有两大类:FM系列和Tree系列。这里我们来介绍一下FM系列。   在传统的线性模型中,每个特征都是独立的,如果需要考虑特征与特征之间的相互作用…

二叉树层序遍历

层序遍历序列为:ABCDEFG 思路:栈是先进后出的数据结构,而队列是先进先出的数据结构。 我们层序遍历,很明显,先遇到的节点先打印,不同于前中后序遍历,我们采用队列结构。 具体执行过程如下&…

深度学习(01)-- 基础学习

文章目录目录1. 深度学习基础1.1 深度学习总览1.2 深度网络训练过程1.2.1 传统神经网络的训练方法为什么不能用在深度神经网络1.2.2 deep learning训练过程1.3 数学知识:2. 九种深度学习模型2.1 受限玻尔兹曼机RBM2.2 自编码器AE(降维)2.3 深…

MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss

损失函数1.激活函数2.损失函数2.1均方误差损失函数2.2交叉熵损失函数2.3 NLLLoss()2.4 BCELoss()1.激活函数 全连接网络又叫多层感知器,多层感知器的基本单元神经元是模仿人类神经元兴奋与抑制机制,对其输入进行加权求和,若超过某一阈值则该…

Java的IO总结

非流式文件类--File类 从定义看,File类是Object的直接子类,同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等,以下是文件操作常用的函数。 File类是对文件系统中文件以及文…