基于用户的协同过滤算法UserCF
基于用户的协同过滤,通过不同用户对物品的评分来评测用户之间的相似性,基于用户之间的相似性做出推荐。简单来讲就是:给用户推荐和他兴趣相似的其他用户喜欢的物品。
举例说明:
基于用户的 CF 的基本思想相当简单,基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到K 邻居后,根据邻居的相似度权重以及他们对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。图2 给出了一个例子,对于用户A,根据用户的历史偏好,这里只计算得到一个邻居– 用户C,然后将用户C 喜欢的物品D 推荐给用户A。
看一个简单算法应用举例吧
1. 首先建立一个java项目,引入以下mahout对应jar包。如图
2. 新建一个数据测试文件test.txt内容有三列,分别是用户ID,商品ID,兴趣打分。
3. 写一个类进行测试
public static voidmain (String args[])throws Exception{
// step:1 构建模型 2 计算相似度 3 查找k紧邻 4 构造推荐引擎
DataModel model =new FileDataModel(newFile("test.txt"));//文件名一定要是绝对路径
UserSimilarity similarity=new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood =newNearestNUserNeighborhood(2,similarity,model);
Recommender recommender=new GenericUserBasedRecommender(model,neighborhood,similarity);
List<RecommendedItem> recommendations=recommender.recommend(1, 2);//为用户1推荐两个ItemID
for(RecommendedItem recommendation :recommendations){
System.out.println(recommendation);
}
}
详细代码参见mahoutTaste项目。
如果数据来自于数据库,典型的用户表和产品表,订单表等,sql语句如下:
selecta.username,b.productname,count(1) as dafen from t_order a inner joint_orderitem b on a.orderid=b.orderid group by a.username,b.productname;
将查询结果形成list,并循环写入文本文件中test.txt,然后根据test.txt进行分析每个用户的具体感兴趣的2个商品,存储到user_taste表中:user_taste:userID,itemids。后台定时分析。
当然也可以直接连接数据库来进行协同过滤算法数据调用,但目前支持的不是很全,比如Oracle数据库就不支持。
目前支持的基于jdbcDatamodel有:
1. org.apache.mahout.cf.taste.impl.model.file.FileDataModel
2. org.apache.mahout.cf.taste.impl.model.hbase.HBaseDataModel
3. org.apache.mahout.cf.taste.impl.model.cassandra.CassandraDataModel
4. org.apache.mahout.cf.taste.impl.model.mongodb.MongoDBDataModel
5. org.apache.mahout.cf.taste.impl.model.jdbc.SQL92JDBCDataModel
6. org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel
7. org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLJDBCDataModel
8. org.apache.mahout.cf.taste.impl.model.jdbc.GenericJDBCDataModel
9. org.apache.mahout.cf.taste.impl.model.jdbc.*
另外如果是maven项目,只需要在maven项目导入一下gav坐标即可。如果远程仓库无法下载,可以考虑将jar下载下来,手动安装到本地仓库。
pom.xml:
<!-- mahout-->
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-integration</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-math</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-examples</artifactId>
<version>0.9</version>
</dependency>