TimeSVD++:动态协同过滤推荐算法

时间感知的隐因子模型

隐因子模型

  静态隐因子模型

r^ui=qTipu

为了学习向量 pu qi 我们对下面的正则化平方差公式最小化:
minq,p(u,i)K(ruiqTipu)2+λ(qi2+pu2)

常数 λ 控制了正则化的程度,通常由交叉验证得到。最小化通常通过随机梯度下降或者交替最小二乘方法得到。

不过有些评分与用户和产品的交互无关:有些用户偏向于给产品打高分,有些产品会收到高分。我们将这类不涉及用户产品交互的影响建模为baseline predictors。令 μ 为整体平均评分。对未知评分 rui 的基准预测评分表示为 bui

bui=μ+bu+bi

将基准预测器与隐因子模型结合我们得到
r^ui=μ+bu+bi+qTipu

考虑隐反馈信息的隐因子模型
r^ui=μ+bu+bi+qTipu+|R(u)|12jR(u)yj

其中集合 R(u) 包含了用户 u 评价过的产品。
模型的解释:这样的模型对于提供了很多隐式反馈(|R(u)|较高)的用户,使得它们的预测偏离基准预测。这对于推荐系统是一个较好的尝试,因为我们总是希望对那些提供了较多反馈用户从而可以较好建模的用户冒更大的风险。对于这类用户我们我们愿意提供不常见的推荐。而对于提供较少用户,我们更希望提供安全的预测,在基准值附近。
将评分分解成不同的部分在这里很方便,它是的我们可以分别对待不同的时间视角:(1)用户的评分偏差 bu (评分尺度)随时间变化;(2)产品的评分偏差 bi (产品流行度)随时间变化;(3)用户偏好 pu (兴趣)随时间变化。不过,我们认为产品特征 qi 与人不同不会随时间改变。我们接下来首先通过基准预测方法详细讨论时间效应。

时间变化的基准预测方法

  基准预测方法主要有两个时间效应:产品评分偏差(产品流行性)的时间效应;用户评分偏差(评分尺度)的时间效应。于是基准方法模型变为

bui(t)=μ+bu(t)+bi(t)

函数 bui(t) 表示用户 u 对产品i t (这一天)的评分。在对上述模型建模时,我们需要考虑到时间变化是渐变型还是突然型。在电影评分的例子中,我们认为电影的喜爱度不太可能在一天之内有太大波动;但是我们发现用户可能在一天之内有较大变化。那么在对用户偏差建模时就要求更精细的时间分辨率,而对产品建模时可以采用较低的时间分辨率。
  首先对于产品偏差,由于我们不需要太精细的分辨率,所以可以将产品偏差分割为基于时间的bin。在每个时间区间对应的bin我们使用一个不同的产品偏差。如何将时间轴分割为时间bin应该在得到更精细的分辨率(更小的bin)和在每个bin中有足够的评分之间进行权衡。在TimeSVD++论文中每个bin为连续十周的数据。因此在整个数据集上大概有30个bins。t对应一个 Bin(t) (在我们的数据中是一个1到30的数),这样电影偏差就被分割为一个静态部分和一个时间变化的部分:
bi(t)=bi+bi,Bin(t)

  对于用户偏差来说,情况就要更复杂了。如何对用户的时间区间进行不同粒度的划分是首要要考虑的问题。
  第一个模型选择是非常简单,使用一个线性函数刻画了用户评分偏差的可能的逐渐的漂移。我们首先引入一些新的符号,对每个用户,我们将其评分的日期的均值表示为 tu 。现在,如果用户在第 t 天评价了一部电影,那么这个评分相关的时间偏差定义为:
devu(t)=sign(ttu)|ttu|β

  

时间变化的隐因子模型

动态邻域模型

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot和Vue.js是两个独立的技术框架,分别用于后端和前端开发。协同过滤推荐算法是一种用于推荐系统的算法,用于根据用户的行为和偏好来推荐相关的内容。 在Spring Boot中,你可以使用Java编写协同过滤推荐算法的代码。以下是一个简单的示例: 1. 创建一个推荐服务类RecommendationService.java: ```java @Service public class RecommendationService { public List<String> getRecommendations(String userId) { // 实现协同过滤推荐算法逻辑 // 根据用户ID获取用户的历史行为数据 // 分析用户行为数据,计算推荐结果 // 返回推荐结果列表 List<String> recommendations = new ArrayList<>(); // 添加推荐结果到列表中 recommendations.add("推荐内容1"); recommendations.add("推荐内容2"); recommendations.add("推荐内容3"); return recommendations; } } ``` 2. 创建一个控制器类RecommendationController.java: ```java @RestController @RequestMapping("/recommendations") public class RecommendationController { @Autowired private RecommendationService recommendationService; @GetMapping("/{userId}") public List<String> getRecommendations(@PathVariable String userId) { return recommendationService.getRecommendations(userId); } } ``` 在Vue.js中,你可以使用JavaScript编写前端页面来展示推荐结果。以下是一个简单的示例: 1. 创建一个Vue组件Recommendation.vue: ```vue <template> <div> <h1>推荐内容</h1> <ul> <li v-for="recommendation in recommendations" :key="recommendation"> {{ recommendation }} </li> </ul> </div> </template> <script> export default { data() { return { recommendations: [], }; }, mounted() { // 调用后端接口获取推荐结果 this.getRecommendations(); }, methods: { getRecommendations() { // 发起HTTP请求获取推荐结果 // 替换为实际的后端接口地址和用户ID const userId = "123"; fetch(`/recommendations/${userId}`) .then((response) => response.json()) .then((data) => { this.recommendations = data; }); }, }, }; </script> ``` 2. 在Vue应用中使用Recommendation组件: ```vue <template> <div> <recommendation></recommendation> </div> </template> <script> import Recommendation from "./components/Recommendation.vue"; export default { components: { Recommendation, }, }; </script> ``` 以上代码示例是一个简单的演示,实际的协同过滤推荐算法可能更加复杂。你可以根据具体的需求和数据结构进行相应的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值