《Mining Large Streams of User Data for Personalized Recommendations》笔记

论文发表年份:2012
主要内容:1、当前在个性化推荐中如何使用数据挖掘技术
2、从 Netflix竞赛中获得的经验;
3、Netflix竞赛中主要使用的个性化推荐技术
4、展望

相对于数据挖掘技术,还存在很多可能对推荐效果影响更大的问题。比如用户交互设计等。但这些不属于本文关注范围。
实际上,商业中使用的绝大多数高级的推荐系统很少是纯粹的协同过滤或者基于内容这样单一的推荐,而一般是混合的。

1.2.推荐系统中的数据挖掘方法
《Recommender Systems Handbook》中有专门的一章来介绍在推荐系统中使用数据挖掘技术。一般地,像PCA、SVD、决策树、聚类、分类、神经网络、贝叶斯及关联规则等都能在推荐系统中使用
2.Netflix 竞赛
2.1从竞赛中获得的经验
netflix半程冠军,经过了2000个小时的努力,共融合了107中算法,实现8.43%的提升。
3.Netflix个性化:不仅仅是评分预测
3.1消费者数据科学
Netflix是一家基于消费者数据科学的组织。也就是一家数据驱动的组织。实际是如何执行的呢?(对A/B test的轻微改变)
1)设定一个假设。比如,算法X能够增加用户参与度
2)设计测试
3)执行测试。将用户分到不同的组中,每组的经历不同,关注最终的反馈
4)让数据说话。基于指标评估

Netflix从线下提出假设到线上模型部署的整个流程如下:
这里写图片描述
Netflix针对的是家庭的推荐,所以不仅仅是推荐准确性,推荐的多样性也非常的重要。此外,还有推荐结果被用户是否能意识到。推荐被用户意识到的好处有很多。比如,增加用户的信任;为了提高推荐效果,用户更加积极的参与反馈。增加用户
信任的另一种途径是增加推荐的解释。

排序
如何给用户生成一个用户感兴趣的推荐列表。最直接最保险的方法是考虑物品的流行度。但流行度是和个性化相对的,如果只考虑流行度,那每个用户的推荐列表都一样。但是如果只考虑个性化,推荐列表可能包含很多质量很差的物品。所以实际
的排序中,需要兼顾考虑流行度和个性化。有什么方法呢?
方法1:最直接的线性组合
这里写图片描述

讨论:我们需要更多的数据还是要更好的模型?
参考文献【1】,【2】都宣称更多的数据会带来更好的效果,但模型对效果几乎没什么影响。如下图所示:
这里写图片描述

但是,这种观念只能说在某些情况下是正确的。但更多场景其实不然。本文作者总结的非常到位,如下:
将模型分为高方差( high variance )模型和高偏差( high bias)模型。
存在两种可能完全相反的原因会造成一个模型效果不好:
原因1:相对已有的数据量,模型太复杂了。这种场景称之为高方差,会造成过拟合(训练误差小,但测试误差大)。解决这种问题可以减小特征数量,或者增加数据。参考文献【1、2】中涉及到的就是这种——相对于训练样本,特征太多了。所以增加数据量能够提高准确性。
原因2:我们的模型太简单,无法“解析”已有的数据。这种场景叫做高偏差。你没法通过增加更多数据来提高效果。如下图所示:
这里写图片描述
那么,对于这种高偏差模型,是不是增加更多的特征就一定有帮助呢? 那也要看情况。
数据还是非常重要的,但如果没有正确的方法,数据就是噪音

研究方向
1.非明确评分
很多的推荐引擎是基于明确评分的。实际上明确的评分有时候存在噪声等问题。能够有效利用到那些用户间接的评分/喜好可能会更好。这方面可以参考【3】、【4】、【5】和【6】。
2.基于上下文感知的推荐
【7】表明,在推荐中,考虑用户所处的上下文(地点、时间),有实际的商业价值。
《Recommender Systems Handbook》有专门的一章介绍基于上下文感知的推荐。感兴趣的可以去学习。

参考文献:
【1】A. Halevy, P. Norvig, and F. Pereira. The Unreasonable Eectiveness of Data. IEEE Intelligent Systems,
24(2):8{12, March 2009
【2】M. Banko and E. Brill. Scaling to very very large corpora for natural language disambiguation. In Proc. of
ACL ‘01, pages 26{33, 2001.
【3】S. Rendle, C. Freudenthaler, Z. Gantner, and L. S.Thieme. BPR: Bayesian personalized ranking from implicit feedback. In Proceedings of the 25th UAI, 2009.
【4】D. Parra and X. Amatriain. Walk the Talk: Analyzing the relation between implicit and explicit feedback for preference elicitation. In User Modeling, Adaption and
Personalization, volume 6787, chapter 22, pages 255{268. Springer, 2011.
【5】D. Parra, A. Karatzoglou, X. Amatriain, and I. Yavuz.Implicit feedback recommendation via implicit-toexplicit ordinal logistic regression mapping. In Proc. of
the 2011 CARS Workshop.
【6】D. H. Stern, R. Herbrich, and T. Graepel. Matchbox:large scale online bayesian recommendations. In Proc.of the 18th WWW, 2009.
【7】M. Gorgoglione, U. Panniello, and A. Tuzhilin. The effect of context-aware recommendations on customer purchasing behavior and trust. In Proc. of Recsys ‘11,
pages 85{92, 2011.

<think>好的,我现在需要解决用户的问题:在微信开发工具中出现TypeError 'Cannot read property datastreams of undefined'的错误。用户希望得到解决方案。首先,我应该回忆一下这类错误的常见原因和处理方法。 根据之前的引用内容,类似的问题比如[^2]中提到,这类错误通常是因为试图访问未定义或null对象的属性。例如,访问某个对象的属性,但该对象本身是undefined或null,导致读取属性失败。这时候需要检查代码中相关的变量是否正确定义和初始化。 接下来,我应该考虑用户的具体错误信息是'datastreams'属性未定义,可能涉及到某个对象未正确初始化。比如,可能在代码中有类似obj.datastreams的访问,但obj本身是undefined。这时候需要定位到代码中的哪一部分出现了这个问题。 然后,解决方案可能包括以下几个步骤: 1. 检查变量初始化:确保访问datastreams属性的对象已经正确初始化,不是undefined。 2. 使用安全访问操作符:比如使用可选链操作符?.来避免访问未定义的属性。 3. 调试工具的使用:利用微信开发者工具的调试功能,设置断点或打印日志,查看相关对象的状态。 4. 检查数据来源:如果datastreams是从服务器或API获取的数据,确保数据正确返回,并且在处理前进行判空处理。 5. 基础库版本问题:如引用中提到的,基础库版本可能导致问题,需要检查并调整基础库版本至稳定版本。 此外,还需要考虑用户是否在特定操作下触发该错误,比如页面加载时,或者某个异步请求完成后。这时候需要检查生命周期函数如onLoad,onReady等,确保数据加载完成后再进行访问。 可能还需要查看用户代码中是否有拼写错误,比如对象名是否正确,或者数据路径是否正确。例如,是否将datastreams错误拼写为datastream,或者大小写不一致。 最后,总结解决方案的步骤,分点说明,让用户能够逐步排查和解决问题,同时提醒用户检查基础库版本,使用调试工具,并进行必要的错误处理。</think>### 解决方案:微信开发工具中TypeError 'Cannot read property datastreams of undefined'错误 #### 1. **定位错误来源** - **检查报错位置**:在微信开发者工具控制台中点击错误信息,跳转到代码具体行数,确认是哪个对象未定义导致访问`datastreams`属性失败。 - **示例代码分析**: ```javascript // 错误示例:假设dataObj未初始化 const data = dataObj.datastreams; // 若dataObj为undefined,触发TypeError ``` #### 2. **确保对象已正确初始化** - **初始化对象**:如果访问的是页面数据(如`data`中定义的变量),需在`data`中声明默认值。 ```javascript // Page定义中添加初始化 Page({ data: { dataObj: {} // 初始化空对象避免undefined } }); ``` - **异步数据判空**:若`datastreams`来自网络请求,需确保数据返回后再操作。 ```javascript // 在请求回调中判空 wx.request({ success: (res) => { if (res.data && res.data.datastreams) { this.setData({ dataObj: res.data }); } } }); ``` #### 3. **使用安全访问操作符(可选链)** - **语法优化**:使用ES6可选链操作符`?.`避免直接访问深层属性。 ```javascript // 修改前 const streams = this.data.dataObj.datastreams; // 修改后 const streams = this.data.dataObj?.datastreams; // 若dataObj为undefined,返回undefined而非报错 ``` #### 4. **调试与日志输出** - **打印中间变量**:在关键位置添加`console.log`确认对象状态。 ```javascript onLoad() { console.log('当前dataObj:', this.data.dataObj); // 检查是否初始化 } ``` #### 5. **检查基础库版本兼容性** - **调整基础库版本**:参考引用,在微信开发者工具中修改基础库版本至稳定版(如2.16.0+),避免因最新版兼容性问题导致报错。 #### 6. **真机调试验证** - **真机与工具对比**:若开发者工具报错但真机正常,可能是工具模拟器环境差异,需以真机表现为准,但仍建议修复工具中的警告。 --- ### 总结步骤 1. 检查对象初始化与异步数据加载逻辑。 2. 使用可选链`?.`或判空操作。 3. 通过日志和断点定位未定义对象。 4. 调整基础库版本或等待官方修复兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值