最近我对推荐引擎很感兴趣,想在这个领域提高自己。我正在阅读 O'Reilly 出版社的《Programming Collective Intelligence》,我认为这是关于这个主题最好的书籍。但是我不知道如何实现引擎;我的意思是“不知道从哪里开始”。我脑海中有一个类似 Last.fm 的项目。
- 我应该从哪里开始创建推荐引擎(应该在数据库端还是后端)?
- 需要什么级别的数据库知识?
- 是否有任何可以用来帮助的开源资源或者其他资源?
- 我应该做哪些第一步?
最近我对推荐引擎很感兴趣,想在这个领域提高自己。我正在阅读 O'Reilly 出版社的《Programming Collective Intelligence》,我认为这是关于这个主题最好的书籍。但是我不知道如何实现引擎;我的意思是“不知道从哪里开始”。我脑海中有一个类似 Last.fm 的项目。
推荐系统的提出建议可以分为两个主要部分:
特征提取非常具体化,要根据被推荐的对象而定。例如,对于音乐来说,某些对象的特征可能是歌曲的频率响应、功率、流派等,而用户的特征可能是年龄、地点等。然后,您需要为每个用户和歌曲创建一个向量,其中向量的各个元素对应于不同感兴趣的特征。
执行实际的推荐只需要深思熟虑的特征向量。请注意,如果您没有选择正确的特征,则您的推荐引擎将失败。这就像让您根据我的年龄告诉我我的性别一样。当然,我的年龄可能会提供一些信息,但我认为您可以想象出更好的问题来问。无论如何,一旦你为每个用户和歌曲创建了特征向量,你就需要训练推荐引擎。我认为做到这点最好的方法是让大量的用户参加您的人口统计测试,然后告诉您他们喜欢的具体歌曲。此时您已经拥有了所需的所有信息。你的工作就是利用你拥有的信息来绘制决策边界。考虑一个简单的例子,您想基于年龄和性别预测用户是否喜欢AC/DC乐队的《Back in Black》。想象一下显示100个数据点的图表。x轴是年龄,y轴是性别(1代表男性,2代表女性)。黑色标记表示用户喜欢这首歌曲,而红色标记则表示他们不喜欢这首歌曲。我猜这张图可能会有很多黑色标记与年龄在12岁到37岁之间的男性相对应,而其余标记都将是红色。因此,如果我们要手动选择决策边界,则会是一个围绕该区域的矩形,其大部分标记为黑色。这被称为决策边界,因为如果一个完全陌生的人告诉您他们的年龄和性别,您只需将他们在图表上标出并问他们是否落在该框中即可。
因此,这里的难点是找出决策边界。好消息是你不需要知道如何实现它。你只需要知道如何使用一些常见的工具,例如神经网络、支持向量机、线性分类器等。同样地,不要被这些大名所迷惑。大多数人无法真正解释这些方法在做什么,他们只知道如何插入数据并获得结果。
虽然我知道有些晚了,但我希望这可以对那些看到这篇文章的人有所帮助。
接下来,我创建了返回上述各点(id、权重)元组列表的函数。有些只考虑有限数量的视频(例如最近的50个),有些通过例如评分、标签计数(标记得越多=表达力越少)修改权重。有些函数返回以下列表:
将所有这些组合成一个列表,只需按视频ID汇总权重,然后按权重排序。目前,在大约1000个视频上效果很好。但是,需要进行后台处理或极端缓存才能使其速度更快。
我希望我可以很快将其简化为通用的推荐引擎或相似性计算器,并作为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
我对其他人如何解决这些算法感兴趣。