如何创build我自己的推荐引擎?
这些天我对推荐引擎很感兴趣,我想在这方面提高自己。 我正在阅读“ 编程集体智慧 ”,我认为这是O'Reilly最好的关于这个主题的书。 但是我不知道如何实现引擎。 我的意思是“不知道”是“不知道如何开始”。 我有一个像Last.fm这样的项目。
- 在哪里(应该在数据库端或后端执行)我开始创build推荐引擎?
- 什么级别的数据库知识将需要?
- 有没有可用于帮助或任何资源的开源软件?
- 我应该做的第一步是什么?
我自己build立了一个video门户。 我的主要想法是收集关于一切的数据:
- 谁上传了video?
- 谁对video发表了评论?
- 哪个标签在哪里创build?
- 谁访问了video? (也跟踪匿名访问者)
- 谁喜欢video?
- 谁对video进行了评分?
- video分配给哪个频道?
- 标题,描述,标签,频道和评论的文本stream由全文索引器收集,该全文索引器对每个数据源赋予权重。
接下来,我创build了函数,返回上述每个点的(id,weight)元组列表。 有些只考虑有限数量的video(例如,最后50个),一些则通过例如评分,标签计数(更经常地标记=较不传神)来修改权重。 有一些函数返回以下列表:
- 类似的video全文search
- 由同一用户上传的video
- 来自这些评论的用户的其他video也进行了评论
- 来自这些collections夹的用户的其他video也很受欢迎
- 其他来自这些评级的评价者也评价(加权)
- 其他video在同一频道
- 其他具有相同标签的video(通过标签的“performance力”加权)
- 播放此video的人播放的其他video(XY最新播放)
- 类似的video评论全文
- 类似的video标题全文
- 类似的影片描述全文
- 类似的video作者:fulltext
所有这些将被合并成一个单一的清单,只是通过videoID总结权重,然后按权重sorting。 现在大约有1000个video可以很好地工作。 但是你需要做后台处理或者极速caching来加快速度。
我希望能尽快减less到通用推荐引擎或相似度计算器,并作为rails / activerecord插件发布。 目前它仍然是我的项目中很好的一部分。
给一个小提示,在ruby代码中看起来像这样:
def related_by_tags tag_names.find(:all, :include => :videos).inject([]) { |result,t| result + t.video_ids.map { |v| [v, TAG_WEIGHT / (0.1 + Math.log(t.video_ids.length) / Math.log(2))] } } end
我会对其他人如何解决这种algorithm感兴趣。
提出build议可分为两个主要部分:
- 特征提取
- build议
特征提取对于被推荐的对象是非常具体的。 例如,对于音乐,对象的某些特征可能是歌曲的频率响应,功率,stream派等等。用户的特征可能是年龄,位置等。然后,为每个用户创build一个vector,歌曲与vector的各种元素对应着不同的感兴趣的特征。
执行实际的build议只需要经过深思熟虑的特征向量。 请注意,如果您不select正确的function,则您的推荐引擎将失败。 这就像要求你根据我的年龄告诉我我的性别。 当然,我的年龄可能提供一些信息,但我想你可以想象更好的问题。 无论如何,一旦你有每个用户和歌曲的特征向量,你将需要培训推荐引擎。 我认为最好的方法是让大量的用户进行人口统计testing,然后告诉你他们喜欢的特定歌曲。 在这一点上,你有所有你需要的信息。 你的工作是用你所掌握的信息来划定一个决策界限。 考虑一个简单的例子。 你想预测一个用户是否喜欢AC / DC的基于年龄和性别的“Back in Black”。 想象一下显示100个数据点的图表。 x轴是年龄,y轴是性别(1是男性,2是女性)。 黑色标记表示用户喜欢这首歌曲,而红色标记表示他们不喜欢这首歌曲。 我的猜测是,这个图表可能有很多与男性和年龄在12到37岁之间的用户相对应的黑色标记,而其余的标记将是红色的。 所以,如果我们要手动select一个决策边界,那么这个区域就是一个矩形,它占据了大部分的黑色标记。 这就是所谓的决策边界,因为如果一个全新的人来找你并告诉你他们的年龄和性别,你只需要在图上画出他们,并询问他们是否属于这个框。
所以,这里最困难的部分是find决策的边界。 好消息是你不需要知道如何做到这一点。 你只需要知道如何使用一些常用的工具。 你可以看看使用neural network,支持向量机,线性分类器等等。再次,不要让大牌骗你。 大多数人不能告诉你这些事情真的在做什么。 他们只知道如何插入和获得结果。
我知道这有点晚了,但我希望这能帮助任何人在这个线程上绊倒。
我有一个基于协作过滤的推荐引擎的2部分博客在Hadoop中实现。
http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/
http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/
这里是开源项目https://github.com/pranab/sifarish的github存储库;
随意使用,如果你喜欢它。
这实际上是一个非常大的问题,所以即使我能给你一个详细的答案,我也怀疑我会有时间……但我有一个build议,看看格林·林登的博客和他的论文基于项目的协同过滤。 Greg在亚马逊使用基于项目的方法实现了推荐引擎的想法,他真的知道他的东西,他的博客和论文是非常可读的。
博客: http : //glinden.blogspot.com/论文: http : //www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (恐怕你需要login才能阅读充分,因为你是CS学生,这应该是可能的)。
编辑你也可以看看Infer.Net ,他们包括一个build立电影数据推荐系统的例子。
最近由Filmaster.com发布了开源(AGPLv3许可)示例推荐引擎。 它是用C ++编写的,它使用作为Netflix挑战的一部分生成的白皮书中的最佳实践。 有关它的文章可以在http://polishlinux.org/gnu/open-source-film-recommendation-engine/find,代码在这里:; http : //bitbucket.org/filmaster/filmaster-test/src /tip/count_recommendations.cpp