您的位置:首页 > 编程语言

4000 冷却算法综合排名改进模型-R实现代码

2016-07-22 22:06 344 查看
近期对投票模型中的牛顿冷却模型结合具体数据及含义进行了改进,并通过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")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: