看了一下排名用的算法,比较有意思,就找到了三种
一种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