本文首先介绍了Slope One算法的原理,然后给出了算法的Java版实现。
一. Slope One 算法的原理介绍
用户 对事物A打分 对事物B打分 X 3 4 Y 2 4 Z 4 ?
用户Z对事物B的打分可能是多少呢?股票上有个说法是平均值可以掩盖一切异常波动,所以股票上的各个技术指标收拾不同时间段的平均值的曲线图或者柱状图等。同样的,Slope One算法也认为:平均值也可以代替某两个未知个体之间的打分差异,事物A对事物B的平均很差是:((3 - 4) + (2 - 4)) / 2 = -1.5,也就是说人们对事物B的打分一般比事物A的打分要高1.5,于是Slope one算法就猜测Z对事物B的打分是4 + 1.5 = 5.5
是不是非常的简单?
加权算法
有n个人对事物A和事物B打分了,R(A->B)表示这n个人对A和对B打分的平均差(A-B),有m个人对事物B和事物C打分 了,R(B->C)表示这m个人对B和对C打分的平均差(B-C),注意都是平均差而不是平方差,现在某个用户对A的打分是ra,对C的打分是 rc,那么A对B的打分可能是:
rb = (n * (ra - R(A->B)) + m * (rc + R(B->C)))/(m+n)
二. Slope One 算法的实现
我自己实现的Slope One:
01 |
package com.liangtee.slopeone.recommender.impl;
|
02 |
03 |
import java.util.HashMap;
|
04 |
import java.util.List;
|
05 |
import java.util.Map;
|
06 |
import java.util.Set;
|
07 |
08 |
import org.slf4j.Logger;
|
09 |
import org.slf4j.LoggerFactory;
|
10 |
11 |
import com.liangtee.slopeone.recommender.DataSetModel;
|
12 |
import com.liangtee.slopeone.recommender.Recommender;
|
13 |
import com.liangtee.slopeone.vo.RecommendedItem;
|
14 |
15 |
/** |
16 |
* Weighted Slope One Algorithm
|
17 |
*
|
18 |
* Just for Fun
|
19 |
*
|
20 |
* @author LiangTE
|
21 |
*
|
22 |
*/
|
23 |
24 |
public class SlopeOneRecommender implements Recommender {
|
25 |
26 |
private static final Logger log = LoggerFactory.getLogger(SlopeOneRecommender. class );
|
27 |
|
28 |
private DataSetModel dataSet = null ;
|
29 |
|
30 |
public SlopeOneRecommender(DataSetModel dataSet) {
|
31 |
this .dataSet = dataSet;
|
32 |
}
|
33 |
34 |
@Override
|
35 |
public float preferenceOnItem( long userID, long ItemID) throws Exception {
|
36 |
|
37 |
if (!dataSet.containsUser(userID)) {
|
38 |
throw new Exception( "not contains this User : " + userID);
|
39 |
}
|
40 |
|
41 |
Set<Long> UIDs = dataSet.getUserIDs();
|
42 |
Map<Long, Float> targetUserRatings = dataSet.getUserRatings(userID);
|
43 |
Set<Long> ratedItems = targetUserRatings.keySet();
|
44 |
|
45 |
Map<Long, Float> diffCache = new HashMap<Long, Float>();
|
46 |
Map<Long, Integer> counter = new HashMap<Long, Integer>();
|
47 |
|
48 |
log.info( "Slope One start to work..." );
|
49 |
|
50 |
for ( long UID : UIDs) { //计算每个用户的差值
|
51 |
if (UID != userID) {
|
52 |
Map<Long, Float> ratings = dataSet.getUserRatings(UID);
|
53 |
for ( long iid : ratedItems) { // iid = item id
|
54 |
if (ratings.containsKey(ItemID) && ratings.containsKey(iid)) {
|
55 |
float diff = ratings.get(ItemID) - ratings.get(iid);
|
56 |
if (diffCache.containsKey(iid)) {
|
57 |
diffCache.put(iid, diffCache.get(iid)+diff);
|
58 |
} else {
|
59 |
diffCache.put(iid, diff);
|
60 |
}
|
61 |
if (counter.containsKey(iid)) {
|
62 |
counter.put(iid, counter.get(iid)+ 1 );
|
63 |
} else {
|
64 |
counter.put(iid, 1 );
|
65 |
}
|
66 |
}
|
67 |
}
|
68 |
}
|
69 |
|
70 |
}
|
71 |
|
72 |
int K = 0 ;
|
73 |
float total = 0F;
|
74 |
for ( long iid : ratedItems) {
|
75 |
if (diffCache.containsKey(iid)) {
|
76 |
float bias = diffCache.get(iid)/counter.get(iid);
|
77 |
float targetUserRating = targetUserRatings.get(iid);
|
78 |
float p = targetUserRating + bias;
|
79 |
total += p;
|
80 |
K++;
|
81 |
}
|
82 |
}
|
83 |
|
84 |
|
85 |
return total/K;
|
86 |
}
|
开源的Slope one的程序包
- Python
http://www.serpentine.com/blog/2006/12/12/collaborative-filtering-made-easy/ - Java
http://taste.sourceforge.net/
http://www.daniel-lemire.com/fr/documents/publications/SlopeOne.java
http://www.nongnu.org/cofi/ - PHP
http://sourceforge.net/projects/vogoo
http://www.drupal.org/project/cre
http://www.daniel-lemire.com/fr/documents/publications/webpaper.txt Slope one算法作者写的,简单明了,强烈推荐。 -
相关推荐
协同过滤算法是推荐系统中常用的一种技术,尤其在电影推荐领域有着广泛的应用。协同过滤的基本思想是通过分析用户的历史行为,如对电影的评分,来推测用户未来可能的兴趣。它分为基于用户(User-Based)和基于物品...
在描述中提到的博文链接虽然缺失,但通常这类博客会详细介绍SlopeOne算法的原理,以及如何将其与大数据技术结合。 首先,让我们详细了解一下Slope One算法。它主要包括两个步骤:预处理(Preprocessing)和预测...
本文将深入探讨基于协同过滤算法的电影推荐系统的设计原理与实现过程。 协同过滤是一种基于用户行为的推荐策略,它不依赖于对内容的直接分析,而是通过对用户历史行为的分析,寻找具有相似兴趣的用户群体,然后依据...
- **基于SlopeOne算法的协同过滤**:SlopeOne算法通过预测用户对未评分物品的评分差,简化了传统协同过滤的计算复杂度。 - **基于SVD算法的协同过滤**:使用奇异值分解(SVD)对用户-物品评分矩阵进行降维,找出...
本项目提供了一些推荐算法的Java实现,包括slopeone、SVD(奇异值分解)以及基于物品邻接的SVD(ItemNeighborSVD)。下面我们将详细探讨这些算法及其在Java中的实现。 1. **slopeone**: - Slope One是一种简单的...
基于协同过滤算法的电影推荐系统方案 本资源摘要信息将详细介绍基于协同过滤算法的电影推荐系统方案,包括协同过滤算法的概念、Taste 引擎的介绍、相似度计算方法等。 一、协同过滤算法 协同过滤算法是一种基于...
协同过滤算法的基本思想是基于兴趣相投、拥有共同经验的群体的喜好来推荐使用者感兴趣的资讯,或者说它是根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品。 协同过滤 CF 分为两大类:基于用户协同...
对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同...
电影推荐系统的核心在于协同过滤算法的实现,其中包括三个关键步骤:用户相似度计算、用户邻域构建以及推荐生成。Apache Mahout 的 Taste 是一个实现这些功能的开源库。Taste 是一个基于 Java 的推荐引擎,它支持 ...
《基于协同过滤算法的电影推荐系统详解》 协同过滤算法在现代互联网推荐系统中扮演着重要角色,尤其在电影推荐领域。本系统采用的是基于协同过滤的推荐策略,旨在通过分析用户的行为和偏好,为用户提供个性化的电影...
《基于协同过滤算法的电影推荐系统》 协同过滤算法在当今的信息时代中扮演着重要的角色,尤其在个性化推荐系统的设计中。电影推荐系统利用协同过滤技术,能够为用户提供精准的影片推荐,提升用户体验。该算法不同于...
Taste 提供了协同过滤算法的实现,包括基于用户和基于内容的推荐,以及如SlopeOne等更高效的算法。它支持Java编写,并且可以利用Hadoop的分布式计算框架MapReduce,以提高大规模推荐系统的性能和可扩展性。 【Data...
协同过滤算法是推荐系统中常用的一种技术,尤其在电影推荐领域。这种算法的基本思想是假设用户会根据他们的历史行为(如评分、购买记录等)来表达自己的兴趣偏好。协同过滤分为基于用户的协同过滤(User-Based ...
在本案例中,电影推荐系统采用了Apache Mahout库中的Taste推荐引擎,它提供了协同过滤算法的实现,包括用户基(User-Based)和物品基(Item-Based)的推荐策略。 Taste是Apache Mahout的一个子项目,是一个高效的...
**基于用户的协同过滤算法**(User-based Collaborative Filtering)是一种经典推荐算法。该算法通过分析用户的历史行为记录,找出与目标用户具有相似兴趣的其他用户,进而推荐这些相似用户喜欢的商品给目标用户。其...
- `GenericUserBasedRecommender`:基于用户的协同过滤算法,它推荐与目标用户具有相似评分历史的其他用户的喜好物品。 - `GenericItemBasedRecommender`:基于物品的协同过滤算法,推荐与用户已喜欢的物品相似的...
在 `RecommenderTest` 类中,可以设置邻居数量(`NEIGHBORHOOD_NUM`)和推荐数量(`RECOMMENDER_NUM`),然后调用具体的推荐算法方法,如 `slopeOne(dataModel)` 来运行 Slope One 算法。 总的来说,Mahout 的推荐...
MOA框架内包含了一些在线协同过滤算法,如Slope One和Adaptive Random Forest,以适应数据流环境中的用户行为变化。 MOA项目的一个显著优势是其灵活性和可扩展性,允许用户自定义算法并与其他Java库集成。此外,它...