我正在构建一个Rails应用程序,向学生推荐导师,反之亦然。我需要根据多个维度匹配它们,例如他们的专业(数学,生物学等),经验(初级等),课程(数学201等),偏好(自我描述的关键词)和评级。
我查看了一些Rails协作推荐引擎(推荐,推荐)和Mahout。在我的情况下,协作推荐似乎不是最佳选择,因为我有更多结构化数据,这允许更结构化的查询。例如,我可以为学生提供推荐逻辑:
if student looks for a Math tutor in Math 201:
if there's a tutor in Math major offering tutoring in Math 201 then return
else if there's a tutor in Math major then sort by experience then return
else if there's a tutor in quantitative major then sort by experience then return
...
我的问题是:
鉴于我的推荐系统是基于偏好的,协作推荐算法有哪些好处?
如果它确实提供了显着的好处,我如何将其与上述基于偏好的推荐相结合?
由于我的方法将涉及查询多个表,因此可能效率不高。我该怎么办?
非常感谢。
答案 0 :(得分:4)
听起来,您对兼容性的衡量可以有利地重新表述为metric。你应该做的是尝试将你的`列'解释为数据维度的不同组成部分。这个想法是你最终应该产生一个二元函数,它返回学生和导师(以及学生/学生和导师/导师)之间兼容性的衡量标准。将此指标扩展到所有类型的数据的动机是,您可以使用此想法将匹配条件重新制定为最近邻搜索:
http://en.wikipedia.org/wiki/Nearest_neighbor_search
这个问题有很多数据结构和解决方案,因为它已得到很好的研究。例如,您可以尝试以下通常与点云数据一起使用的库:
http://www.cs.umd.edu/~mount/ANN/
为了优化一些事情,您还可以通过在数据集上运行主成分分析来尝试预过滤数据。这样可以减少进行最近邻搜索的空间的尺寸,并且通常还具有减少一些噪音的额外好处。
祝你好运!答案 1 :(得分:3)
就个人而言,我认为协同过滤(cf)对您来说效果很好。请注意,cf的核心理念是 serendipity 。换句话说,添加太多约束可能会导致对用户的冷淡建议。 cf的重点是基于 类似的 用户提供令人兴奋的相关建议。你不需要施加这么严格的限制。
如果您决定实施自定义cf算法,我建议您阅读亚马逊[pdf]发布的这篇文章,该文章讨论了亚马逊的推荐系统。简而言之,他们使用的算法如下:
for each item I1
for each customer C who bought I1
for each I2 bought by a customer
record purchase C{I1, I2}
for each item I2
calculate sim(I1, I2)
//this could use your own similarity measure, e.g., cosine based
//similarity, sim(A, B) = cos(A, B) = (A . B) / (|A| |B|) where A
//and B are vectors(items, or courses in your case) and the dimensions
//are customers
return table
请注意,此表的创建将在离线状态下完成。在线算法可以快速返回推荐。显然,推荐质量非常好。
在任何情况下,如果你想更好地了解一般的cf(例如,各种cf策略)以及为什么它可能适合你,请阅读那篇文章(不用担心,它非常易读) 。实现简单的cf推荐器并不困难。优化可以在以后进行。