熵是对不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性越大,熵也越大。目前已经在工程技术、社会经济等领域得到了非常广泛的应用。
熵权法的基本思路是根据指标变异性的大小来确定客观权重。
参考数据: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∑n​Pij​ln(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=1n​yij​yij​​
yij==0时,令Pij=0y_ij==0时,令 P_{ij}=0yi​j==0时,令Pij​=0

三:求指标权重
Wi=1−Ein−∑i=1nEiW_i=\frac{1-E_i}{n-\sum_{i=1}^nE_i}Wi​=n−∑i=1n​Ei​1−Ei​​
四:求单位得分
Si=∑i=1nXijWjSi=\sum_{i=1}^nX_{ij}W_jSi=i=1∑n​Xij​Wj​
如果为负向指标,则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;}
}

用熵值法求对战游戏结束后玩家之间的评分相关推荐

  1. df满足条件的值修改_如何用python实现熵值法求指标权重(实例)

    权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...

  2. 【人因工程】熵值法求权重正反向化的分析

    目录 一.问题提出 二.问题分析 1. 第一步: 2. 第二步 3. 第三步 三.进一步分析 总结 一.问题提出 所需数据集见链接: 人因工程熵值法求权重正反向化的分析配套数据-数据集文档类资源-CS ...

  3. python中是什么意思权重_如何用python实现熵值法求指标权重(实例)

    权重是指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性.而在我们的数据分析过程中,倘若各个 ...

  4. excel熵值法计算权重_熵值法的Excel基本步骤

    各位亲们,前天从盐城回来,我收拾收拾就开始忙着补上上个星期拖的更了.本期主要内容主要是对盐城滨海湿地野外采样的总结,在论文写作中指标权重的赋予,以及分享几套宁波大学特有的PPT模板. 从7月28日-8 ...

  5. 层次分析法和熵值法经典实操案例+数据

    1.数据来源:无 2.时间跨度:无 3.区域范围:无 4.指标说明: 层次分析法(Analytic Hierarchy Process,简称AHP)是美国运筹学家.匹兹堡大学T. L. Saaty教授 ...

  6. 熵值法在matlab上的实现

    1.熵值法原理 熵值法是一种客观赋权法,其根据各项指标观测值所提供的信息的大小来确定指标权重.设有m个待评方案,n项评价指标,形成原始指标数据矩阵X=(xij)m×n,对于某项指标xj,指标值xij的 ...

  7. 利用熵值法确定指标权重---原理及Python实现

    背景 在进行一些综合评估类项目时,需要给一些指标确定一个合理的权重,用来计算综合得分,这种综合评估类项目在实际的业务中有很多应用,比如:学生奖学金评定方法.广告效果综合评估.电视节目满意度综合评估.用 ...

  8. 熵值法确定权重(matlab附代码)

    文章目录 一.基本原理 二.计算过程 三.实例 一.基本原理 ​ 熵值法是一种客观赋权法,是根据各项指标观测值所提供的信息的大小来确定指标权重. ​ 在信息论中,熵是对不确定性信息的一种度量.信息量月 ...

  9. 熵值法与TOPSIS法以及两者结合

    补充:TOPSIS法(优劣解距离法)介绍及 python3 实现 一.熵值法 熵值法的主要目的是对指标体系进行赋权 熵越大说明系统越混乱,携带的信息越少,权重越小:熵越小说明系统越有序,携带的信息越多 ...

最新文章

  1. Linux系统性能分析:内存 优化
  2. handlerinterceptoradapter 获取请求参数_SSM框架防止重复请求
  3. mt65xx android phone win10驱动,mt65xx android phone驱动下载
  4. hdu 3236 二维背包
  5. 微信(支付宝)小程序蓝牙4.0线上项目
  6. c语言字符指针清零,C语言中字符串的内存地址操作的相关函数简介
  7. python中文版软件下载-Python中文版下载_PyCharm官方最新版下载_3DM单机
  8. 隐式反馈的去噪,模型取得巨大提升!
  9. 拓端tecdat|R语言空间可视化:绘制英国脱欧投票地图
  10. Java高并发编程实战1,那些年学过的锁
  11. IIS与CuteFTP进行网站发布
  12. 抖音短视频无水印下载方法
  13. 打开桌面计算机投屏到扩展屏,华为智慧屏怎么共享电脑屏幕
  14. 质疑 追寻 与成果出版——读戴德金1872年《连续性和无理数》之1
  15. redis在CentOs服务器上的安装和设置开机自启动
  16. 【JAVA】java递归测试考拉兹猜想/冰雹猜想
  17. 【源码】loess method扩展算法仿真
  18. linux分析测序数据,[转]如何分析测序结果
  19. serial port not selected
  20. 微信查询天气公众账号小记

热门文章

  1. 将字符串中的前导*号全部删除,中间和尾部的*号不删除
  2. FPGA实现灰度转换:RGB转YCBCR
  3. 姓名中最忌讳的50个字
  4. 个税计算器支持相关请回复本帖
  5. 二本大学计算机专业国际认证,二本大学计算机排名及分数线
  6. mac中sublime替换回车键
  7. TryHackMe-进攻性渗透测试-15_活动目录持久化
  8. 从此以后都不关我的事
  9. ZF预编码,R-ZF预编码,脏纸预编码(DPC预编码)
  10. 按文件名对文件夹中的文件分类