首页 > 编程知识 正文

协同过滤推荐算法代码,r语言递归算法怎么理解

时间:2023-05-06 20:24:06 阅读:48648 作者:2182

协同过滤的步骤如下:

建立数据模型-用户相似度算法-用户邻居算法-推荐算法。

基于用户的协同过滤算法是在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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。