Slope One 算法试图同时满足这样的的 5 个目标:
1. 易于实现和维护:普通工程师可以轻松解释所有的聚合数据,并且算法易于实现和测试。
2. 运行时可更新的:新增一个评分项,应该对预测结果即时产生影响。
3. 高效率的查询响应:快速的执行查询,可能需要付出更多的空间占用作为代价。
4. 对初次访问者要求少:对于一个评分项目很少的用户,也应该可以获得有效的推荐(这个适合解决推荐系统cold start 问题)。
5. 合理的准确性:与最准确的方法相比,此方法应该是有竞争力的,准确性方面的微小增长不能以简单性和扩展性的大量牺牲为代价。
Slope One的基本概念很简单, 例子1, 用户X, Y和A都对Item1打了分. 同时用户X,Y还对Item2打了分, 用户A对Item2可能会打多少分呢?
User | Rating to Item 1 | Rating to Item 2 |
X | 5 | 3 |
Y | 4 | 3 |
A | 4 | ? |
加权算法: 接下来我们看看加权算法(Weighted Slope One). 如果有100个用户对Item1和Item2都打过分, 有1000个用户对Item3和Item2也打过分. 显然这两个rating差的权重是不一样的. 因此我们的计算方法是 (100*(Rating 1 to 2) + 1000(Rating 3 to 2)) / (100 + 1000)。
- 例子:
- 首先计算item1和item2的平均差值,((5-3)+(3-4))/2=0.5,还有item1和item3的平均差值,就是5-2=3,然后推算lucy对item1的评分,根据item1和item2的平均差值来看lucy对item1的评分可能为2+0.5=2.5,同理根据item1和item3的平均差值lucy对item1的评分可能为5+3=8.
- 现在如何取舍那?使用加权平均数应该是一种比较好的方法:(因为2.5是根据两个值推算的,8是通过一个只推算的)
- slope one 算法差不多真的就是这么简单了!
- 有一个开源的Java程序taste里面有一个完整的slope one算法的实现,包括程序和一个关于grouplens数据的实例程序(或者说是验证程序……)。
- 个人觉得slope one 很好、很强大呀!足够简单,推荐准确度也不逊色与其他复杂的推荐算法(当然,这个东西更大程度上取决与数据样本)。而且taste程序写的也很不错,稍加改造应该就可以用了。