代码改变世界

排名算法

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