文档介绍:基于用户评分Kmeans聚类的协同过滤
推荐算法实现
一:基于用户评分Kmeans聚类的协同过滤推荐算法实现步骤1、构建用户-电影评分矩阵:
publicObjectreadFile(StringfileName){
List<Stlts;
}
//比较新旧聚类中心是否相等
publicbooleanIsPlayerEqual(Userp1,Userp2){if(p1==p2){
returntrue;
}
if(p1==null||p2==null){
returnfalse;
}
booleanflag=true;
double[]s1=p1・getWeights();
double[]s2=p2・getWeights();
for(inti=0;i<s2・length;i++){if(s1[i]!=s2[i]){
flag=false;
}
break;
}
returnflag;
}
//找出新的聚类中心
publicUserfindNewCenter(List<User>ps){Usert=newUser();
if(ps==null||()==0){returnt;
}
double[]ds=new
double[(0).getWeights().length];
for(inti=0;i<(0).getWeights().length;i++){
for(intj=0;j<();j++){ds[i]+=(j).getWeights()[i];
}
}
for(inti=0;i<(0).getWeights().length;
}
i++){
ds[i]=ds[i]/();
}
(ds);
returnt;
}
//比较距离,找出最小距离下标
publicintcomputOrder(double[]dists){
doublemin=0;
intindex=0;
for(inti=0;i<-1;i++){doubledist0=dists[i];
if(i==0){
min=dist0;
index=0;
}
doubledist1=dists[i+1];
if(min>dist1){
min=dist1;
index=i+1;
}
returnindex;
}
//判断距离,欧几里得算法,最快
publicdoubledistance(Userp0,Userp1){
doubledis=0;
try{
double[]s1=();
double[]s2=();
for(inti=0;i<;i++){dis+=(s1[i]-s2[i],2);
}
}catch(Exceptionexception){}
(dis);
}
}
3、计算用户之间的相似度:
publicdouble[]generateSimilarityMatrix2(StringuserId,List<User>list,double[][]weight){
List<String>user=newArrayList<String>();for(inti=0;i<();i++){((i).getUserId());
}
double[]similarityMatrix=newdouble[()];
for(inti=0;i<();i++){//循环核心用户
if((i).equals(userId)){
similarityMatrix[i]=1;
continue;}similarityMatrix[i]=newComputeSimilarity().computeSimilarity(weight[(userId)],weight[((i))]);
}
returnsimilarityMatrix;
}
4、获取最近邻和计算推荐结果:publicList<Object>recommendCloserAndKeyword(double[]similarityMatrix,double[][]weight,StringuserId,List<Stri