创建 Recommendation/Prediction 引擎的最佳方法

Best method to creating a Recommendation/Prediction Engine

今天来这里是想问问大家打算怎么开发推荐系统。请注意,我不是要代码,而是要类似于 algorithm/maths.

的代码

我正在处理的网站提供了很多项目,每个项目都有数百个不同类别的用户评分,从 0-5 不等,这里是项目的示例 table:

ID名称 描述平均评分 成本可用性功能
1 Blablabla 4.2 2.2 2.3 4.0
2 汽车 Blablabla 3.5 3.3 3.0 4.4
3 Blablabla 4.9 5.0 4.2 0.2
4 食物 Blablabla 2.8 2.1 4.8 1.2

现在,每当用户对项目进行评分时,它都会在不同的 table 中添加一行,其中保存了所有评分。服务器每天更新 ITEMS(以上)table 中的值,使用来自评分 table.

的所有批准评分的平均值

因此,成本、可用性和功能等列是项目可以具有的不同类别,用户可以对其进行评分。平均评分列是所有类别的中位数。

这是关于如何设置所有内容的最重要信息。现在,我想做的是让用户能够使用滑块根据搜索条件搜索项目。每个类别的滑块以及用户提交表单时的内容。

提交后,它将遍历每个项目并根据用户使用滑块输入的内容计算分数。例如:

用户搜索成本中的 3 个、可用性中的 3 个和功能中的 4 个并提交。结果应该是最符合该标准的项目,在这种情况下(按照从最佳到最差匹配的顺序,ID):大约 2、1、3、4。

我怎样才能做到这一点?将 "weight" 添加到每个类别。我一直在做很多研究,但我在高等数学方面不是很有经验。计算欧几里德距离并比较它们似乎是个好主意,但我更愿意听到更多方法。

这是我在评论中提到的简单算法的概要。假设用户的滑块是:

cost=2.3, usability=2.1, functionality=4

您可以构建一个 SQL 查询,该查询将尝试根据您的 table 中的值最小化这些值的 "total distance"。伪SQL-代码:

SELECT
   (cost - 2.3)^2 + (usability - 2.1)^2 + (functionality - 4)^2 AS score
FROM
   product_table
ORDER BY
   score

方块 (^2) 的目的是防止负分相互抵消。我想你也可以在这里做 ABS()(去掉减号),但采用正方形似乎是一种流行的方法。

这个table的结果是按照推荐的顺序列出产品,距离最小的在前(即最推荐的,根据这个简单的算法)。

如果您愿意,可以将每个子句乘以权重以使其更重要; 1.0 的值没有区别,较小的值会降低其影响,较大的值会放大其贡献。如果您想完全忽略这三个度量中的一个,只需将其贡献乘以 0,这将确保该度量的距离差异没有影响。

我不记得你是否可以 ORDER BY 别名派生列,这可能取决于你使用的数据库。如果在您的特定引擎中不可能,请对此进行查看,然后您可以按 "real" 列排序。


请注意,这需要将用户值注入您的 SQL。如果您不能在此处使用参数化,请务必 cast/escape 仔细处理您的数据。