基于pearson(皮尔逊)相似度的用户推荐算法

最近因为写一些数据分析报告,把写博客的进度耽误了一点,不过不要紧,我最近优化了一下做出的推荐算法,用pearson相似度替换了欧氏距离相似度,优化了推荐算法代码,另外将700多个用户的推荐投资品循环计算了。


先说一下pearson相似度:

pearson相似度与欧式距离相似度的最大区别在于它比欧式距离更重视数据集的整体性;因为pearson相似度计算的是相对距离,欧式距离计算的是绝对距离。

就实际应用来说,有不同量纲和单位的数据集适合使用pearson相似度来计算,相同量纲和单位的数据集适合使用欧氏距离。

因为目前我使用的数据集都是投资者与投资品的匹配关系,量纲是相同的,所以使用pearson相似度计算的推荐结果与欧式距离计算的推荐结果是一致的。


好了,言归正传,我们来看一下pearson相似度的真面目吧,实际项目中代码如下:


#pearson相似度算法,按行计算与其他用户的相似度矩阵
PearsonDistanceSimilarity<-function(M){
  row<-nrow(M)
  s<-matrix(0, row, row)
  for(z1 in 1:row){
    for(z2 in 1:row)
      try({if(z1!=z2){
        s[z1,z2]<-cor(M[z1,],M[z2,])
        }
        else {s[z1,z2]<-0}
      },silent = T)
  }
  s
  }


因为之前的文章中,我们已经将投资者与投资品的喜好矩阵M搭建好了,所以这里我直接调用了它。

然后我建立了一个行列均为用户数(也就是row)的空矩阵用来放置我计算的相似度结果。

然后建立了一个for循环计算每一行与其他行的pearson相似度,并写入对应的矩阵集,如第一行与第七行的相似度,直接写入矩阵第一行第七列;其中如果计算本行与本行的相似度,直接取值为0,因为不能根据自己的投资行为给自己推荐投资品,如第二行与第二行计算相似度,直接设置为0。


在这里我普及一下pearson相似度的计算方法:



在R里面提供了cor函数可以直接计算该值。



然后我又优化了一下推荐算法的代码,主要是去掉了多余的代码,具体代码如下:

#推荐算法,推荐相似度最高的用户均投资过的产品,并依据喜好权重给出推荐评分
UserBasedRecommender<-function(uid,n,M,S,N){
  row<-ncol(N)
  col<-ncol(M)
  r<-matrix(0, row, col)
  N1<-N[uid,]
  for(z1 in 1:length(N1)){
    num<-intersect(which(M[uid,]==0),which(M[N1[z1],]!=0)) #可计算的列
    #     print(num)
    
    for(z2 in num){
      #       print(paste("for:",z1,N1[z1],z2,M[N1[z1],z2],S[uid,N1[z1]]))
      r[z1,z2]=M[N1[z1],z2]*S[uid,N1[z1]]
    }
  }
  
  sum<-colSums(r)
  s2<-matrix(0, 1, col)
  for(z1 in 1:length(N1)){
    num<-intersect(which(colSums(r)!=0),which(M[N1[z1],]!=0))
    for(z2 in num){
      s2[1,][z2]<-s2[1,][z2]+S[uid,N1[z1]]
    }
  }


  r2<-matrix(0, n, 2)
  rr<-sum/s2
  item <-dimnames(M)[[2]]
  for(z1 in 1:n){
    w<-which.max(rr)
    if(rr[w]>0.5){
      r2[z1,1]<-item[which.max(rr)]
      r2[z1,2]<-as.double(rr[w])
      rr[w]=0
    }
  }
  r2
}


相比上次说明的推荐算法语句(具体请看:http://blog.csdn.net/qq_28887735/article/details/51985729),我去掉了s2矩阵的第二行。


好了,这次的推荐结果如何呢?我给大家截个图:

基于pearson(皮尔逊)相似度的用户推荐算法_第1张图片


使用欧式距离计算相似度,对本数据集来说,共有245个投资者可以找到有效的推荐产品;

其中5个投资者推荐了3个投资品,180个投资者推荐了2个投资品,60个投资者推荐了1个投资品;


使用皮尔逊相似度算法,对本数据集来说,共有85个投资者可以找到有效的推荐产品;

其中51个投资者推荐了3个投资品,34个投资者推荐了2个投资品。


整体来说,在相同初始值下,欧氏距离计算相似度,可以增加推荐广度;皮尔逊算法计算相似度,可以增加推荐深度。

另外我的数据集量纲一致,可能会对此结果有部分影响,仅供参考,大家如果有新的想法可直接与我联系,一起实践更容易获得真知。

你可能感兴趣的:(r语言,协同过滤算法,优化,R语言,算法)