我今天在这里问你如何计划开发推荐系统。请注意,我不是要求代码,而是要求算法/数学。
我正在处理的网站提供了很多项目,每个项目都有数百个用户评分,范围从0到5各种类别,这里是项目表的一个例子:
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
现在,每当用户对某个项目进行评分时,它会在另一个表格中添加一行,其中保存所有评级。服务器每天一次更新ITEMS(上图)表中的值,以及评级表中所有已批准评级的平均值。
因此,“成本,可用性和功能”等列是项目可以具有的不同类别,用户可以对其进行评级。平均评分栏是所有类别的中位数。
这是关于如何设置所有内容的最重要信息。现在,我想做的是让用户能够使用滑块根据搜索条件搜索项目。每个类别的滑块行以及用户提交表单时的内容。
提交后,它将浏览每个项目并根据用户使用滑块输入的内容计算得分。例如:
用户在费用中搜索3,在可用性中搜索3,在功能中搜索4并提交。结果应该是最符合该标准的项目,在这种情况下(按照从最佳到最差匹配的顺序,ID):2,1,3,4约。
我将如何实现这一目标?为每个类别添加“重量”。我一直在做很多研究,但我对高等数学不是很有经验。看起来像计算欧几里德距离并比较它们是一个好主意,但我宁愿听到更多的方法。
答案 0 :(得分:0)
这是我在评论中提到的简单算法的概要。让我们说用户的滑块是:
cost=2.3, usability=2.1, functionality=4
您可以构建一个SQL查询,尝试最小化"总距离"来自表中值的这些值。伪SQL码:
SELECT
(cost - 2.3)^2 + (usability - 2.1)^2 + (functionality - 4)^2 AS score
FROM
product_table
ORDER BY
score
广场(^2
)的目的是防止负分数相互抵消。我想你也可以在这里做ABS()
(删除减号)但是采用正方形似乎是一种流行的方法。
此表的结果是按推荐顺序列出产品,首先列出最小距离(即根据此简单算法推荐最多)。
如果您愿意,可以将每个子句乘以一个权重,使其更重要;值1.0
将没有区别,值减少将减少其影响,值更大将放大其贡献。如果您想完全忽略这三个度量中的一个,只需将其贡献乘以0
,这将确保该度量的距离差异无效。
我不记得你是否可以ORDER BY
一个别名派生列,它可能取决于你正在使用的数据库。如果在您的特定引擎中无法实现,请从中进行查看,然后您可以通过" real"列。
请注意,这需要将用户值注入SQL。如果您不能在此处使用参数化,请务必仔细转换/转义数据。