大家好,欢迎来到IT知识分享网。
缘起
作为老师,我常常反问自己,能否找出一种方法,不用把学生考试成绩做加总,用总分来排名,作为判断学生素质某些方面优劣的依据。这个问题一直困扰着我,带着这样的思考,这几天寒假,稍微能闲点,在网上查了相关资料,找到了一种方法叫“熵权法”。为解开自己工作中的困惑,便用python实现了“熵权法加权排序问题”。
实验过程表明,“熵权法”,算法本身完全脱离了人为干预,是一种基于指标数据本身的计算方法,指标权重的计算完全依赖于指标值本身。很显然,它是一种不掺杂任何人为因素的客观计算方法,在一定程度上是可靠和公允的。
熵权法
熵最先由申农引入信息论。
熵权法的基本思路是根据指标变异性的大小来确定客观权重。
一般来说,若某个指标的信息熵越小,表明指标值变异程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的信息熵越大,表明指标值变异程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。
我们可以按照这个思路来确定指标的权重,有了权重后,就可以计算出“加权平均数”了。
算法
python实现算法
import pandas as pd import numpy as np import math from numpy import array pd.options.display.float_format = '{:.4f}'.format df = pd.read_excel('1822学生成绩单.xlsx',index_col='姓名')
数据标准化处理
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() scaler.fit(df) df_scaler_minmax = scaler.transform(df)
计算pij
rows,cols = df_scaler_minmax.shape # 预留变量空间 pij = [[None] * cols for i in range(rows)] pij = array(pij) for col in range(cols): for row in range(rows): if df_scaler_minmax[row,col]==0: pij[row,col]=0 else: pij[row,col]=df_scaler_minmax[row,col]/df_scaler_minmax[:,col].sum()
计算Ej
n = df.index.size k = 1/math.log(n) e = [[None] * cols for i in range(rows)] e = np.array(e) for col in range(cols): for row in range(rows): if pij[row,col] == 0: e[row,col] = 0 else: e[row,col] = pij[row,col]* math.log(pij[row,col]) Ej = ((e.sum(axis=0))*(-k))
结果:
array([0.93839,0.90424, 0.8737, 0.75485, 0.08706], dtype=object)
计算权重
Wj = (1-Ej)/ (cols- Ej.sum()) Wj = np.reshape(Wj,(1,Wj.size))
计算标准化综合加权分
score = np.dot(df.values,Wj.T) s = pd.DataFrame(score,index = df.index, columns=['标准化加权综合分'])
结果排序
result = s.sort_values(by='标准化加权综合分', axis=0, ascending=False) result['标准化加权综合分排名'] = range(1, len(result) + 1) final = pd.DataFrame(df.mean(axis=1), columns=['原始平均分']).sort_values(by='原始平均分',ascending=False) final['原始平均分排名'] = range(1,final.index.size+1) final.iloc[0,1] = 1 for i in range(1,final.index.size): if final.iloc[i,0] == final.iloc[i-1,0]: final.iloc[i,1] = final.iloc[i-1,1] else: final.iloc[i,1] = final.iloc[i-1,1]+1 f = final.join(result) f.sort_values(by='原始平均分',ascending=False)
结语
显然,用简单算数平均分排序与权熵法加权综合分排序结果有一定程度的差异。简单算数平均分实质是每个指标的权重是一样的加权算数平均数,没有考虑指标的重要性程度,而“权熵法”则是通过指标数据本身相对大小关系,计算确定权重,然后计算的加权算数平均分,它不考虑人的主管判断,却考虑了指标的重要性程度。
当然,每种方法都有自身的优缺点,权熵法也不例外。例如,它没有考虑和体现管理者的意志,这是该方法无法克服的。
在此 发文仅仅作为一种思路,供大家参考。
如果能在管理中加以适当应用,改善科学管理实效,也算是学以致用了。
有兴趣的,不妨试一试!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/85934.html