2011-02-06 33 views
3

我试图通过PHP实现一个斜率一个算法用于基于用户的项目推荐。为此,我使用OpenSlopeOne库。我遇到的问题是生成的建议与用户无关。斜坡一个实现提供较差的建议

目前我有两个表:user_ratings和slope_one。 user_ratings表格非常简单。它包含该特定用户给出的每个项目的评分(user_id,item_id和user_item_rating)。 slope_one表遵循OpenSlopeOne的默认模式:item_id1,item_id2,时间和评级。

的slope_one表使用下面的SQL过程填充:

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条建议),但我只是没有看到任何形式的关联。事实上,大多数推荐对于用户来说似乎都是一样的,即使是完全不同的商品评分。

回答

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中实现的另一个变体是在估计的偏好计算中使用更好的权重。它可以选择具有高标准偏差的差异和低标准偏差的差异。这有利于差异计算在许多用户。这是一个粗略的步骤,但有帮助。