用熵值法求对战游戏结束后玩家之间的评分
熵是对不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性越大,熵也越大。目前已经在工程技术、社会经济等领域得到了非常广泛的应用。
熵权法的基本思路是根据指标变异性的大小来确定客观权重。
参考数据:https://login.sina.com.cn/sso/login.php?useticket=0&returntype=META&service=blog&gateway=1&url=http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html
求熵值法步骤:
假设有数据:
有A、B、C… n个单位;
每个单位有指标{X1,X2,X3…Xn};
记单位索引为i,指标索引为j,其实对应的就是i个单位,j个指标的二位数组float[i][j]。记二维数组为x,有:
x=newfloat[i][j]x=new float[i][j]x=newfloat[i][j]
一:标准化指标数据
对于正向值指标:
yij=xij−min(xi)max(xi)−min(xi)y_{ij}=\frac{x_{ij}-min(x_i)}{max(x_i)-min(x_i)}yij=max(xi)−min(xi)xij−min(xi)
对于负向指标:
yij=max(xi)−xijmax(xi)−min(xi)y_{ij}=\frac{max(x_i)-x_{ij}}{max(x_i)-min(x_i)}yij=max(xi)−min(xi)max(xi)−xij
max(xi)−min(xi)==0时,则令yij=0max(x_i)-min(x_i)==0时,则令y_{ij}=0max(xi)−min(xi)==0时,则令yij=0
二:求指标熵值
熵值公式:
Ej=−k∑i=1nPijln(Pij)E_j=-k\sum_{i=1}^nP_{ij}ln(P_{ij}) Ej=−ki=1∑nPijln(Pij) (n为i的最大值),(n为i的最大值),(n为i的最大值),
其中
k=1ln(n)k=\frac{1}{ln(n)}k=ln(n)1,
Pij=yij∑i=1nyijP_{ij}=\frac{y_{ij}}{\sum_{i=1}^ny_{ij}}Pij=∑i=1nyijyij
yij==0时,令Pij=0y_ij==0时,令 P_{ij}=0yij==0时,令Pij=0
三:求指标权重
Wi=1−Ein−∑i=1nEiW_i=\frac{1-E_i}{n-\sum_{i=1}^nE_i}Wi=n−∑i=1nEi1−Ei
四:求单位得分
Si=∑i=1nXijWjSi=\sum_{i=1}^nX_{ij}W_jSi=i=1∑nXijWj
如果为负向指标,则Xij=−Xij如果为负向指标,则X_{ij}=-X_{ij}如果为负向指标,则Xij=−Xij
,
下面做2个测试数据样本,科室评分和游戏结算评分,也可以用于装备属性等的评分,视情况而定。
代码中运行结果如下:
可看出同一个属性,多个单位之间数据差距越大会造成权重越小。
上代码:
NewBehaviourScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class NewBehaviourScript : MonoBehaviour
{void Start(){Test();}[ContextMenu("测试")]public void Test(){Test1();Test2();}public void Test1(){Debug.Log("--------------------Test1:球项目科室综合得分------------------------------------");bool[] ps = new bool[] {true,true,true,true,true,true,true,true,true};float[][] dss = new float[][]{//护理项: X1 X2 X3 X4 X5 X6 X7 X8 X9 new float[] { 100, 90, 100, 84, 90, 100, 100, 100, 100 },//科室Anew float[] { 100, 100, 78.6f, 100, 90, 100, 100, 100, 100 },//Bnew float[] { 75, 100, 85.7f, 100, 90, 100, 100, 100, 100 },//Cnew float[] { 100, 100, 78.6f, 100, 90, 100, 94.4f, 100, 100 },//Dnew float[] { 100, 90, 100, 100, 100, 90, 100, 100, 80 },//Enew float[] { 100, 100, 100, 100, 90, 100, 100, 87.5f, 100 },//Fnew float[] { 100, 100, 78.6f, 100, 90, 100, 55.6f, 100, 100 },//Gnew float[] { 87.5f, 100, 85.7f, 100, 100, 100, 100, 100, 100 },//Hnew float[] { 100, 100, 92.9f, 100, 80, 100, 100, 100, 100 },//Inew float[] { 100, 90, 100, 100, 100, 100, 100, 100, 100 },//Jnew float[] { 100, 100, 92.9f, 100, 90, 100, 100, 100, 100 }//K};GetEntropyScores(dss, ps);}public void Test2(){Debug.Log("--------------------Test2:求及时对战游戏玩家结算玩家得分------------------------------------");bool[] ps = new bool[] {true,false,true//死亡为负向};//假如只考虑KDA三个数据项,且首订权重想等。float[][] dss = new float[][] {// 击杀 死亡 助攻new float[]{ 7, 5, 3},//玩家1new float[]{ 1, 15, 1},//2new float[]{ 12, 0, 2},//3new float[]{ 1, 5, 5},//4new float[]{ 0, 5, 1}//5};GetEntropyScores(dss, ps);}/// <summary>/// 数据经过熵值计算,求出多个单位多个属性的最后评估得分/// </summary>/// <param name="datas">二维度数据,行为单位,列为属性</param>/// <param name="positives">数据的正负向,对应属性列</param>/// <returns></returns>public float[] GetEntropyScores(float[][] datas, bool[] positives){float[] ejs = new float[datas[0].Length];//熵值float[] wjs = new float[ejs.Length];//权重float[] scores = new float[datas.Length];//最终得分//第一步:标准化数据,float[][] normals = new float[datas.Length][];//标准化后的各个属性值,因为属性数据积极性有正负向,所以统一标准化float[] colMins = new float[datas[0].Length];//同一属性列中的最小值float[] colMaxs = new float[datas[0].Length];//同一属性列中的最大值//1,求出同一属性列中每列最大值和最小值for (int i = 0; i < datas.Length; i++){for (int j = 0; j < datas[i].Length; j++){if (i == 0){colMins[j] = datas[i][j];colMaxs[j] = datas[i][j];}else{colMins[j] = Mathf.Min((float)colMins[j], (float)datas[i][j]);colMaxs[j] = Mathf.Max((float)colMaxs[j], (float)datas[i][j]);}}}string normalstr = "标准化后的数据:\n";//2,求出各个参数的标准化后的值:normalsfloat[] sumOfColNormals = new float[datas[0].Length];for (int i = 0; i < datas.Length; i++){normals[i] = new float[datas[i].Length];for (int j = 0; j < datas[i].Length; j++){if ((colMaxs[j] - colMins[j]) == 0){normals[i][j] = 0;}else {if (positives[j])//正向指标{normals[i][j] = (datas[i][j] - colMins[j]) / (colMaxs[j] - colMins[j]);}else//负向指标{normals[i][j] = (colMaxs[j] - datas[i][j]) / (colMaxs[j] - colMins[j]);}}sumOfColNormals[j] += normals[i][j];normalstr += " " + normals[i][j];}normalstr += "\n";}Debug.Log(normalstr);//第二部:求熵值,得到ejs//1,公式求和部分,得到sumOfColPijLogPijfloat[] sumOfColPijLogPij = new float[datas[0].Length];for (int i = 0; i < normals.Length; i++){for (int j = 0; j < normals[i].Length; j++){float Pij = sumOfColNormals[j] == 0 ? 0 : normals[i][j] / sumOfColNormals[j];float PijLogPij = Pij * (Pij == 0 ? 0 : Mathf.Log(Pij));sumOfColPijLogPij[j] += PijLogPij;}}string ejsStr = "熵值\n";float sumOfejs = 0;//2,公式-k*求和部分,得到ejsfloat k = 1 / Mathf.Log(datas.Length);for (int j = 0; j < sumOfColPijLogPij.Length; j++){ejs[j] = -k * sumOfColPijLogPij[j];sumOfejs += ejs[j];ejsStr += " " + ejs[j];}//第三部分:求权重值,得到wjsstring wsStr = "权重值:\n";for (int j = 0; j < wjs.Length; j++){wjs[j] = (1 - ejs[j]) / (datas[0].Length - sumOfejs);wsStr += " " + wjs[j];}//第四部分:求出最终评分,得到scroresstring scoresStr = "最终评分:\n";for (int i = 0; i < datas.Length; i++){for (int j = 0; j < datas[i].Length; j++){scores[i] += datas[i][j] * wjs[j] * (positives[j] ? 1 : -1);}scoresStr += " " + scores[i];}Debug.Log(ejsStr);Debug.Log(wsStr);Debug.Log(scoresStr);return scores;}
}
用熵值法求对战游戏结束后玩家之间的评分相关推荐
- df满足条件的值修改_如何用python实现熵值法求指标权重(实例)
权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...
- 【人因工程】熵值法求权重正反向化的分析
目录 一.问题提出 二.问题分析 1. 第一步: 2. 第二步 3. 第三步 三.进一步分析 总结 一.问题提出 所需数据集见链接: 人因工程熵值法求权重正反向化的分析配套数据-数据集文档类资源-CS ...
- python中是什么意思权重_如何用python实现熵值法求指标权重(实例)
权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...
- excel熵值法计算权重_熵值法的Excel基本步骤
各位亲们,前天从盐城回来,我收拾收拾就开始忙着补上上个星期拖的更了.本期主要内容主要是对盐城滨海湿地野外采样的总结,在论文写作中指标权重的赋予,以及分享几套宁波大学特有的PPT模板. 从7月28日-8 ...
- 层次分析法和熵值法经典实操案例+数据
1.数据来源:无 2.时间跨度:无 3.区域范围:无 4.指标说明: 层次分析法(Analytic Hierarchy Process,简称AHP)是美国运筹学家.匹兹堡大学T. L. Saaty教授 ...
- 熵值法在matlab上的实现
1.熵值法原理 熵值法是一种客观赋权法,其根据各项指标观测值所提供的信息的大小来确定指标权重.设有m个待评方案,n项评价指标,形成原始指标数据矩阵X=(xij)m×n,对于某项指标xj,指标值xij的 ...
- 利用熵值法确定指标权重---原理及Python实现
背景 在进行一些综合评估类项目时,需要给一些指标确定一个合理的权重,用来计算综合得分,这种综合评估类项目在实际的业务中有很多应用,比如:学生奖学金评定方法.广告效果综合评估.电视节目满意度综合评估.用 ...
- 熵值法确定权重(matlab附代码)
文章目录 一.基本原理 二.计算过程 三.实例 一.基本原理 熵值法是一种客观赋权法,是根据各项指标观测值所提供的信息的大小来确定指标权重. 在信息论中,熵是对不确定性信息的一种度量.信息量月 ...
- 熵值法与TOPSIS法以及两者结合
补充:TOPSIS法(优劣解距离法)介绍及 python3 实现 一.熵值法 熵值法的主要目的是对指标体系进行赋权 熵越大说明系统越混乱,携带的信息越少,权重越小:熵越小说明系统越有序,携带的信息越多 ...
最新文章
- Linux系统性能分析:内存 优化
- handlerinterceptoradapter 获取请求参数_SSM框架防止重复请求
- mt65xx android phone win10驱动,mt65xx android phone驱动下载
- hdu 3236 二维背包
- 微信(支付宝)小程序蓝牙4.0线上项目
- c语言字符指针清零,C语言中字符串的内存地址操作的相关函数简介
- python中文版软件下载-Python中文版下载_PyCharm官方最新版下载_3DM单机
- 隐式反馈的去噪,模型取得巨大提升!
- 拓端tecdat|R语言空间可视化:绘制英国脱欧投票地图
- Java高并发编程实战1,那些年学过的锁
- IIS与CuteFTP进行网站发布
- 抖音短视频无水印下载方法
- 打开桌面计算机投屏到扩展屏,华为智慧屏怎么共享电脑屏幕
- 质疑 追寻 与成果出版——读戴德金1872年《连续性和无理数》之1
- redis在CentOs服务器上的安装和设置开机自启动
- 【JAVA】java递归测试考拉兹猜想/冰雹猜想
- 【源码】loess method扩展算法仿真
- linux分析测序数据,[转]如何分析测序结果
- serial port not selected
- 微信查询天气公众账号小记