冷卻算法綜合排名改進模型-R實現代碼

近期對投票模型中的牛頓冷卻模型結合具體數據及含義進行了改進,並通過R語言進行了實現,模型邏輯並不複雜,在之後的博文中會添加上去,代碼中存在各種條件句是由於實際可操作數據中存在各種情況,數據來源於爬蟲累計數據。

R代碼

##讀入數據集
rankData<-read.csv("F://rankData.csv",header=T,as.is=T)
qidian=rankData[which(rankData$vpuid==110350),]##提取指定條件下的數據集作品字典
works<-unique(qidian[,3])
times<-sort(unique(qidian[,11]))
##基於指定指標計算熱度值
getHot<-function(rankData,works,value_col,time_col){
  n=length(works)
  result<-data.frame()
  for(i in 1:n){
    work<-rankData[grep(works[i],rankData[,3]),]
    m=nrow(work)
    #求增長量
    create<-array(,m)
    time<-array(,m)
    hot<-array(,m)
    if(m<2){
      hotList<-data.frame(work,hot)
      result<-rbind(result,hotList)
    }else{
      ##求增量及相鄰時間間隔    
      time[1]=0
      create[1]=work[value_col][1,1]
      for(j in 2:m){
        if(is.na(create[j-1])&&is.na(work[value_col][j,1])==FALSE){
          create[j-1]=work[value_col][j,1]
          create[j]=work[value_col][j,1]
        }else if(is.na(work[value_col][j-1,1])==FALSE&&is.na(work[value_col][j,1])){
          create[j]=work[value_col][j-1,1]
        }else if(is.na(work[value_col][j-1,1])&&is.na(work[value_col][j,1])){
          create[j]=create[j-1]
        }else{
          create[j]=(work[value_col][j,1]-work[value_col][j-1,1])
        }
        time[j]=as.Date(work[time_col][j,1])-as.Date(work[time_col][j-1,1])
      }
      ##求增長率及熱度值
      hot[1]=create[2]
      for(k in 2:m){
        if(length(create)==0){
          break
        }else{
          if(create[k]==0){
            hot[k]=hot[k-1]*exp(-time[k])
          }else{
            hot[k]=hot[k-1]*exp((create[k]-create[k-1])*time[k]/create[k-1])
          }
        }       
      }
      #print(work[1:8])
      #print(hot)
      hotList<-data.frame(work,hot)
      result<-rbind(result,hotList)
    }   
  }
  return (result)
}
##基於hot值,得到秩
getRank<-function(times,result){
  n<-length(times)
  rankResult<-data.frame()
  for(i in 1:n){
    times[i]
    dayData<-result[grep(times[i],result[,11]),]
    rank<-order(dayData[ncol(dayData)])
    rankTemp<-data.frame(dayData,rank)
    rankResult<-rbind(rankResult,rankTemp)
  }
  return(rankResult)
}
##求加權綜合秩
getResult<-function(info_cols,w,result){
  x=info_cols
  m=nrow(result)
  n=ncol(result)
  #print(list(x,m,n))
  len=length(w)
  ranklist<-data.frame()
  rankTemp<-array(,)
  for(i in 1: m ){
    hot_cover=0
    for(j in info_cols:n){
      hot_cover=hot_cover+w[j-x+1]*result[i,j]
    }
    hot=hot_cover/len
    rankTemp[i]=hot
  }
  ranklist<-data.frame(result,rankTemp)  
  return(ranklist)
}
####方法調用####
rankData<-read.csv("F://分類別//排名算法//rankData.csv",header=T,as.is=T)
qidian=rankData[which(rankData$vpuid==110350),]##提取指定條件下的數據集作品字典
works<-unique(qidian[,3])
times<-sort(unique(qidian[,11]))
result_1<-getHot(qidian,works,7,11)
rank_1<-getRank(times,result_1)
result_2<-getHot(qidian,works,8,11)
rank_2<-getRank(times,result_2)
result_3<-getHot(qidian,works,9,11)
rank_3<-getRank(times,result_3)
#result_4<-getHot(qidian,works,19,11)
#rank_4<-getRank(times,result_4)
#result_5<-getHot(qidian,works,20,11)
#rank_5<-getRank(times,result_5)
#result_6<-getHot(qidian,works,21,11)
#rank_6<-getRank(times,result_6)
#result_7<-getHot(qidian,works,22,11)
#rank_7<-getRank(times,result_7)
#result<-data.frame(rank_1,rank_2[ncol(rank_2)],rank_3[ncol(rank_3)],rank_4[ncol(rank_4)],rank_5[ncol(rank_5)],rank_6[ncol(rank_6)],rank_7[ncol(rank_7)])
result<-data.frame(rank_1[1:ncol(rank_1)],rank_2[ncol(rank_2)],rank_3[ncol(rank_3)])
#result<-data.frame(rank_1[1:ncol(rank_1)],rank_2[ncol(rank_2)])
w=c(1/3,1/3,1/3)
#w=c(1/2,1/2)
info_cols=ncol(rank_1)
lastResult<-getResult(info_cols,w,result)
lastRank<-getRank(times,lastResult)
write.csv(lastRank,"F://rank_qidian.csv")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章