我正在开发一个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
...我的问题是:
非常感谢。
发布于 2012-04-18 06:55:34
听起来,您对兼容性的度量可能会被重新定义为指标。您应该做的是尝试将您的“列”解释为数据维度的不同组件。其思想是,您最终应该生成一个二进制函数,它返回学生和导师(以及学生/学生和导师/导师)之间兼容性的度量。将此度量扩展到所有类型数据的动机是,您可以使用这个想法将匹配条件重新定义为最近邻搜索:
搜索
由于这一问题已经得到了很好的研究,因此有大量的数据结构和解决方案。例如,您可以尝试以下库,它经常与点云数据一起使用:
http://www.cs.umd.edu/~mount/ANN/
要对数据集进行优化,还可以尝试通过对数据集运行主组件分析来对数据进行预筛选。这将使您减少空间的维数,在其中进行最近的邻居搜索,通常有额外的好处,减少一定量的噪音。
分析
祝好运!
发布于 2012-04-21 19:41:57
就我个人而言,我认为协作过滤(cf)会对你很好。请注意,cf的核心思想是意外发现。换句话说,增加太多的约束可能会给用户带来不温不火的建议。cf的主要目的是基于相似的用户提供令人兴奋的相关建议。你不必施加如此严格的限制。
如果您可能决定实现定制的cf算法,我建议阅读由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推荐并不困难。可以在以后进行优化。
https://stackoverflow.com/questions/10117263
复制相似问题