排名算法
2016-03-10 23:17 我的梦想那么大 阅读(1026) 评论(1) 编辑 收藏 举报看了一下排名用的算法,比较有意思,就找到了三种
一种IMDB排名,用于电影排名
一种Elo,用户coc,英雄联盟
一种忘记叫什么了,会随着时间的推移而降低排名的算法,有人知道不??(我忘记具体是什么了)可以降低马太效应
算法一公式:imdb top 250用的是贝叶斯统计的算法得出的加权分(Weighted Rank-WR),公式如下:
weighted rank (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
其中:
R = average for the movie (mean) = (Rating) (是用普通的方法计算出的平均分)
v = number of votes for the movie = (votes) (投票人数,需要注意的是,只有经常投票者才会被计算在内,这个下面详细解释)
m = minimum votes required to be listed in the top 250 (currently 1250) (进入imdb top 250需要的最小票数,只有三两个人投票的电影就算得满分也没用的)
C = the mean vote across the whole report (currently 6.9) (目前所有电影的平均得分)
算法二公式:
//我写的这个还不是太好,计算比较多,可以改成查表的方式优化
算法三公式(大概是这样):
分数=第一天分数*(权值)+前一天分数*(权值)+前前一天分数*(权值)//具体忘记了
代码没测试,直接发出来了//哪里错了和我说一下
package com.sougn.basic.algorithm; public class ScatteredFactory { public int[][] IMDB(int[][] intList , int topMin){//IMDB排名算法--豆瓣电影拍名--贝叶斯统计 int[][] nowNum = null; Imdb imdb = new Imdb(intList, topMin); nowNum = imdb.nowNum(); return nowNum; } public int[] ELO(int aNum , int bNum , int whoWin){//Elo rating system排名算法---等级分排名,不设置k值 int[] nowNum = null; Facemash facemash = new Facemash(aNum, bNum, whoWin); nowNum = facemash.nowNum(); return nowNum; } public int[] ELO_K(int aNum , int bNum , int whoWin , int k){//Elo rating system排名算法---等级分排名,设置k值 int[] nowNum = null; Facemash facemash = new Facemash(aNum, bNum, whoWin , k); nowNum = facemash.nowNum(); return nowNum; } }
package com.sougn.basic.algorithm; public class Facemash { private int aNum;//a用户的基础分数 private int bNum;//b用户的基础分数 private int whoWin;//谁赢了比赛,1用户为a,其他为b用户 private int k=16;//等级区分,推荐16 public int[] nowNum() { int[] nowNum = new int[2]; int eA = 1/(1+(int)Math.pow((double)10,(bNum-aNum)/400));//a用户的期望表现 int eB = 1/(1+(int)Math.pow((double)10,(aNum-bNum)/400));//b用户的期望表现 if(whoWin == 1)//a用户赢了 { nowNum[0] = aNum+k*(1-eA);//1,赢一局的1分 nowNum[1] = bNum+k*(-1-eB);//-1,输一局扣1分 }else//b用户赢了 { nowNum[0] = aNum+k*(-1-eA);//1,输一局的1分 nowNum[1] = bNum+k*(1-eB);//1,赢一局加1分 } return nowNum; } public Facemash(int aNum , int bNum , int whoWin)//不设置k值,使用默认16 { this.aNum = aNum; this.bNum = bNum; this.whoWin = whoWin; } public Facemash(int aNum , int bNum , int whoWin , int k)//自定义k值 { this.aNum = aNum; this.bNum = bNum; this.whoWin = whoWin; this.k = k; } }
package com.sougn.basic.algorithm; public class Imdb { private int[][] intList = new int[10000][2]; private int topMin;//进入排行榜的最小票数 public Imdb(int[][] intList , int topMin) { this.intList = intList; this.topMin=topMin; } public int[][] nowNum(){//int[][] 平均分数和人数 int intListLength = intList.length; int num = 0; for(int i = 0; i <intListLength ; i++) { num += intList[i][0];//所有的总分数 } int average = 0; average = num/intListLength;//所有总数的平均分 for(int i = 0 ; i < intListLength ; i++) { intList[i][2] = (intList[i][1]/(intList[i][1]+topMin))*intList[i][0]+(topMin/(intList[i][1]+topMin))*average; } return intList; } }
写错了记得和我说一下哦
照着别人写的一个游览器不兼容页面,觉得挺好看的
最近好无聊啊,大三求实习1034465036@qq.com