协同过滤的步骤如下:
建立数据模型-用户相似度算法-用户邻居算法-推荐算法。
基于用户的协同过滤算法是在Mahout库中模块化的,由四个模块进行统一的方法调用。 首先,建立数据模型(DataModel ),然后定义用户相似度算法(UserSimilarity ),然后定义用户邻居算法(UserNeighborhood ),最后推荐算法由于基于物品的协同过滤算法(ItemCF )的过程也很相似,所以消除第三步骤来计算用户的邻居算法就可以了。
软件环境: Win7 64位Eclipse4.4 jdk1.6
使用Java语言,借用Mahout库的API,实现基于用户的协同过滤算法,进行商品推荐。
1 .数据集
//testCF.csv
1101,5.0
1102,3.0
1103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4.0
3,105,4.5
3,107,5.0
4101,5.0
4,103,3.0
4104,4.5
4,106,4.0
5,101,4.0
5102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
该testCF.csv数据集,第一列为用户编号UserID,第二列为商品编号ItemID,第三列为得分Preference Value。
借用Java的Mahout库,实现协同过滤算法。
//UserBased.java
package com.xie;
importorg.Apache.mahout.cf.taste.com mon.taste exception;
importorg.Apache.mahout.cf.taste.impl.com mon.longprimitiveiterator;
importorg.Apache.mahout.cf.taste.impl.model.file.*;
importorg.Apache.mahout.cf.taste.impl.neighborhood.*;
importorg.Apache.mahout.cf.taste.impl.recommender.*;
importorg.Apache.mahout.cf.taste.impl.similarity.*;
importorg.Apache.mahout.cf.taste.model.*;
importorg.Apache.mahout.cf.taste.recommender.*;
importorg.Apache.mahout.cf.taste.similarity.*;
import java.io.*;
import java.util.*;
公共类用户基础{
finalstaticintneighborhood _ num=2;
finalstaticintrecommender _ num=3;
publicstaticvoidmain (字符串[ ] args ) throws IOException,TasteException {
string file=' src/data/testcf.CSV ';
数据模型=新文件数据模型(新文件) );
usersimilarityuser=neweuclideandistancesimilarity;
nearestnuserneighborhoodneighbor=newnearestnuserneighborhood (neighborhood _ num,user,model );
recommenderr=newgenericuserbasedrecommender (模型,neighbor,user );
longprimitiveiteratoriter=model.getuser ids (;
wile(Iter.Hasnext () ) ) )。
long uid=iter.nextLong (;
列表列表=r.recommend (uid,RECOMMENDER_NUM;
系统. out.printf (uid : % s )、uid );
for
(RecommendedItem ritem : list) {System.out.printf("(%s,%f)", ritem.getItemID(), ritem.getValue());
}
System.out.println();
}
}
}
效果如下:
图(1) 协同过滤,从而进行商品推荐
结果说明:
对于uid=1的用户,给他推荐计算得分最高的2个物品,104和106。
对于uid=2的用户,给他推荐计算得分最高的1个物品,105。
对于uid=3的用户,给他推荐计算得分最高的2个物品,103和102。
对于uid=4的用户,给他推荐计算得分最高的1个物品,102。
对于uid=5的用户,没有推荐。
用Java实现协同过滤的工程代码:
http://download.csdn.net/detail/sanqima/9374529
方法二:用R语言实现协同过滤算法
软件环境:win7 64位 + RStudio 0.99 + R3.2.3
//mahout1.R
# part1 -------------------------------------------------------------------
##加载arules包
library(arules)
##建立模型矩阵
FileDataModel
##读取CSV文件到内存
data
##增加列名
names(data)
##计算用户数
user
##计算产品数
item
uidx
iidx
##定义存储矩阵
M
i
##给矩阵赋值
for(n in 1:nrow(i)){
M[i[n,][1], i[n,][2]]
}
dimnames(M)[[2]]
##返回矩阵值
M
}
# part2 -------------------------------------------------------------------
##欧式距离相似度算法
EuclideanDistanceSimilarity
row
##相似度矩阵
s
for(z1 in 1:row){
for(z2 in 1:row){
if(z1 < z2){
##可计算的列
num
sum
for(z3 in num){
sum
}
s[z2,z1]
##对算法的阈值进行限制
if(s[z2,z1] > 1) s[z2,z1]
if(s[z2,z1] < -1) s[z2,z1]
}
}
}
ts
w
s[w]
s ##返回用户相似度矩阵
}
# part3 -------------------------------------------------------------------
##用户近邻算法
NearestNUserNeigborhood
row
neighbor
for(z1 in 1:row){
for(z2 in 1:n){
m
neighbor[z1,][z2]
S[,z1][m]=0
}
}
neighbor
}
# part4 -------------------------------------------------------------------
##推荐算法
UserBasedRecommender
row
col
r
N1
for(z1 in 1:length(N1)){
num
for(z2 in num){
r[z1,z2] = M[N1[z1],z2]*S[uid,N1[z1]]
}
}
##输出推荐矩阵
sum
s2
for(z1 in 1:length(N1)){
num
for(z2 in num){
s2[1,][z2]
s2[2,][z2]
}
}
s2[,which(s2[2,]==1)]=10000
s2
r2
rr
item
for(z1 in 1:n){
w
if(rr[w]>0.5){
r2[z1,1]
r2[z1,2]
rr[w]=0
}
}
r2
}
# part5 -------------------------------------------------------------------
##调用算法
setwd("G:\myProject\RDoc\Unit2\rChap2")
myFile
NeighborHodd_num
Recommender_num
myM
myS
myN
##对用户user= 1的推荐结果
R1
##对用户user= 2的推荐结果
R2
##对用户user= 3的推荐结果
R3
##对用户user= 4的推荐结果
R4
##对用户user= 5的推荐结果
R5
效果如下:
图(2)用R语言实现协同过滤算法
转自:http://blog.csdn.net/sanqima/article/details/50389765