我正在尝试通过PHP实现Slope One算法,以实现基于用户的项目推荐。为此,我正在使用OpenSlopeOne库。我遇到的问题是所生成的建议与用户完全无关。
目前我有两个表:user_ratings和slope_one。 user_ratings表非常简单。它包含该特定用户(user_id,item_id和user_item_rating)给出的每项评级。 slope_one表遵循OpenSlopeOne的默认架构:item_id1,item_id2,次数和评级。
使用以下SQL过程填充slope_one表:
CREATE PROCEDURE `slope_one`()
begin
DECLARE tmp_item_id int;
DECLARE done int default 0;
DECLARE mycursor CURSOR FOR select distinct item_id from user_ratings;
DECLARE CONTINUE HANDLER FOR NOT FOUND set done=1;
open mycursor;
while (!done) do
fetch mycursor into tmp_item_id;
if (!done) then
insert into slope_one (select a.item_id as item_id1,b.item_id as item_id2,count(*) as times, sum(a.rating-b.rating) as rating from user_ratings a, user_ratings b where a.item_id = tmp_item_id and b.item_id != a.item_id and a.user_id=b.user_id group by a.item_id,b.item_id);
end if;
END while;
close mycursor;
end
为了获取给定用户的最相关建议,我执行以下查询:
SELECT
item.*
FROM
slope_one s,
user_ratings u,
item
WHERE
u.user_id = '{USER_ID}' AND
s.item_id1 = u.item_id AND
s.item_id2 != u.item_id AND
item.id = s.item_id2
GROUP BY
s.item_id2
ORDER BY
SUM(u.rating * s.times - s.rating) / SUM(s.times) DESC
LIMIT 20
如前所述,这似乎不起作用。我正在使用相当大的数据集(10,000多条建议),但我没有看到任何形式的相关性。事实上,大多数建议似乎对用户来说都是相同的,即使是完全不同的项目评级。
答案 0 :(得分:5)
(是的,我故意给出另一个答案。)
另一个答案是,所有这些算法都有优点和缺点,并且在某一天表现良好,但在其他方面表现不佳。但是我前段时间对于斜坡有一个类似的观察,甚至还得到了Daniel Lemire的一些评论,他最初提出了实施。
考虑当数据变得100%密集时会发生什么 - 每个用户对每个项目进行评级。项目A和项目B之间的评级差异是所有评级用户u的评级差异的平均值:平均值(r_uB-r_uA)。但是,正如所有用户评价的那样,仅接近B的平均评级(超过所有用户),减去A的平均评级:平均评分(r_uB) - 平均评分(r_uA)。称为平均值(B)和平均值(A)是为了方便。
想象一下整体平均评分最高的P项。 A和P之间的差异将大于A和任何其他B之间的差异;它是(平均(P) - 平均值(A)),相对于(平均值(B) - 平均值(A))。 P的差异总是高于任何其他B乘以(平均值(P) - 平均值(B))。
但是,由于该算法通过将这些差异添加到用户的评级来估计偏好,并对其进行平均,因此P始终成为所有用户的最佳建议。无论用户的评分是什么,无论差异如何,P(和平均)的总和最大。等等。
这是数据变得密集的趋势,我认为你已经看到了这种效应的回声。这不是“错误的”(毕竟P被高度评价!)但是当建议变得非个性化时,感觉直觉上不是最理想的。
Daniel Lemire表示,在一些后续文章中描述的更好的方法是将数据模型分为“正面”和“负面”评级,并从两者中构建独立模型。它避免了一些这样做并提供了更好的性能。
在Apache Mahout中实现的另一个变体是在估计的偏好计算中使用更好的权重。它可以选择对具有高标准偏差的差异和低标准偏差的差异进行加权。这有利于在许多用户上计算的差异。这是一个粗略的步骤,但有帮助。
答案 1 :(得分:1)
您可以在Java implementation中尝试Apache Mahout。来自Mahout in Action的excerpt涵盖了其用法。这可能有助于作为第二个数据点,有助于区分算法与实现问题。
截至Mahout 0.9,停用者已经停止使用。看到 https://mahout.apache.org/