2

我正在构建一个向学生推荐导师的 Rails 应用程序,反之亦然。我需要根据他们的专业(数学、生物等)、经验(初级等)、班级(数学 201 等)、偏好(自我描述的关键字)和评分等多个维度进行匹配。

我查看了一些 Rails 协作推荐引擎(recommendable、recommendify)和 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
  ...

我的问题是:

  1. 鉴于我的推荐系统将基于偏好,协作推荐算法有什么好处?

  2. 如果它确实提供了显着的好处,我如何将它与上述基于偏好的推荐结合起来?

  3. 由于我的方法将涉及查询多个表,因此可能效率不高。我该怎么办?

非常感谢。

4

2 回答 2

4

听起来您对兼容性的衡量可以重新制定为一个有利可图的指标。您应该做的是尝试将您的“列”解释为数据维度的不同组成部分。这个想法是你最终应该产生一个二元函数,它返回学生和导师(以及学生/学生和导师/导师)之间兼容性的度量。将此指标扩展到所有类型的数据的动机是,您可以使用此想法将匹配标准重新制定为最近邻搜索:

http://en.wikipedia.org/wiki/Nearest_neighbor_search

这个问题有很多数据结构和解决方案,因为它已经被很好地研究过了。例如,您可以尝试以下经常用于点云数据的库:

http://www.cs.umd.edu/~mount/ANN/

为了稍微优化一下,您还可以尝试通过对数据集运行主成分分析来预过滤数据。这可以让您减少进行最近邻搜索的空间维度,并且通常具有减少一些噪音的额外好处。

http://en.wikipedia.org/wiki/Principal_component_analysis

祝你好运!

于 2012-04-18T06:55:34.580 回答
3

就我个人而言,我认为协同过滤 (cf) 对你很有效。请注意,cf 的中心思想是serendipity。换句话说,添加太多约束可能会导致对用户的推荐不温不火。cf 的重点是根据相似用户提供令人兴奋的相关推荐。您不需要施加如此严格的约束。

如果您可能决定实施自定义 cf 算法,我建议您阅读 Amazon 发表的这篇文章[pdf],其中讨论了 Amazon 的推荐系统。简而言之,他们使用的算法如下:

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 推荐器并不困难。后期可以进行优化。

于 2012-04-21T19:41:57.707 回答