(一)建模目的:
如何客观又合理地评价一部电影的受欢迎度呢?生活中有很多这样的场景,仅有个别人的看法,显然不能如实地反映这部电影的受欢迎度,通过抽样的方法,选取合理的指标建立评价模型,最终取得一个得分来相对评价电影的受欢迎度。
(二)熵权法的原理:
熵衡量着系统的混乱程度,可以拿来衡量信息的多少。指标的变异程度越小,所反映的现有信息量越少,其对应的权重也越低。也就是说,熵权法是使用指标内部所包含的信息量,来确定该指标在所有指标之中的地位。
(三)基本步骤:
1)数据标准化处理
对原始矩阵进行标准化:
2)信息熵的计算
(1)计算第项指标在第i年的数值占该指标比重():
(2)计算第j项指标熵值(),当时,,
3)权重的计算
计算第j项指标的变异系数()和权重():
4)计算TOPSIS中的优劣距离和综合评价得分
(1)由标准化矩阵和各指标权重可得加权标准化矩阵:
(2)计算正负理想解:
(3)计算正负理想解的欧式距离:
(4)计算综合评价值:
(三) 具体实际应用
(1)学习正向指标和负向指标在实际场合的应用。一般来说,从数学的角度,通过相关矩阵正相关关系为正向指标,负相关关系为负向指标,当然并不是绝对的;从实际生活的角度,一个变量的增大导致最终因变量的增大,如在现实生活中,我们通常认为,一个学生的期末成绩通常与作业的完成质量,期中成绩,课堂的出勤率及参与度有正相关,与缺勤率呈负相关。实际应用中,应具体结合数据和实际意义来确定正向指标和负向指标。
(2)理解字符串的筛选
i == str(f'X{j}负')
import pandas as pd import numpy as np data=pd.read_excel("data.xlsx", sheet_name=0,header=0,index_col=0) #读取数据 m,n=data.shape #获取行数m和列数n #熵权法计算 def Y_ij(data1): #矩阵标准化(min-max标准化) for i in data1.columns: for j in range(n+1): if i == str(f'X{j}负'): #负向指标 data1[i]=(np.max(data1[i])-data1[i])/(np.max(data1[i])-np.min(data1[i])) else: #正向指标 data1[i]=(data1[i]-np.min(data1[i]))/(np.max(data1[i])-np.min(data1[i])) return data1 Y_ij=Y_ij(data) #标准化矩阵 None_ij = [[None] * n for i in range(m)] #新建空矩阵 def E_j(data3): #计算熵值 data3 = np.array(data3) E = np.array(None_ij) for i in range(m): for j in range(n): if data3[i][j] == 0: e_ij = 0.0 else: P_ij = data3[i][j] / data3.sum(axis=0)[j] #计算比重 e_ij = (-1 / np.log(m)) * P_ij * np.log(P_ij) E[i][j] = e_ij E_j=E.sum(axis=0) return E_j E_j = E_j(Y_ij) #熵值 G_j = 1 - E_j #计算差异系数 W_j = G_j / sum(G_j) #计算权重 WW= pd.Series(W_j, index=data.columns, name='指标权重') #print(WW) Y_ij.to_excel("Y_ij.xls",sheet_name='Y_ij') WW.to_excel("WW.xls",sheet_name='WW') #TOPSIS计算 Y_ij = np.array(Y_ij) #Y_ij为标准化矩阵 Z_ij = np.array(None_ij) #空矩阵 for i in range(m): for j in range(n): Z_ij[i][j]=Y_ij[i][j]*W_j[j] #计算加权标准化矩阵Z_ij Imax_j=Z_ij.max(axis=0) #最优解 Imin_j=Z_ij.min(axis=0) #最劣解 Dmax_ij = np.array(None_ij) Dmin_ij = np.array(None_ij) for i in range(m): for j in range(n): Dmax_ij[i][j] = (Imax_j[j] - Z_ij[i][j]) ** 2 Dmin_ij[i][j] = (Imin_j[j] - Z_ij[i][j]) ** 2 Dmax_i=Dmax_ij.sum(axis=1)**0.5 #最优解欧氏距离 Dmin_i=Dmin_ij.sum(axis=1)**0.5 #最劣解欧氏距离 C_i=Dmin_i/(Dmax_i+Dmin_i) #综合评价值 Dmax_i= pd.Series(Dmax_i, index=data.index, name='最优解') Dmin_i= pd.Series(Dmin_i, index=data.index, name='最劣解') C_i= pd.Series(C_i, index=data.index, name='综合评价值') pd.concat([Dmax_i, Dmin_i, C_i]).to_excel("C_i.xls")
(四)与其他综合评价的区别:
层次分析法:与之相比,较强的主观性;判断矩阵基本由个人填写,往往最适用没有数据的情况。在确定各层次各因素之间的权重时,如果只是定性的结果,单个个体的想法(我认为有70%的可能),则常常不容易被别人接受,因此Santy等人提出了一致矩阵法,即:
- 不把所有因素放在一起比较,而是两两比较;对此时采用相对尺度,以尽可能减少性质不同的诸因素相互比较的困难,以提高准确性;
成对比较矩阵是表示本层所有因素针对上一层某一个因素(准侧或目标)的相对重要性的比较。成对比较矩阵的元素 表示的是第 个因素相对于第 个因素的比较结果,这个值使用的是Santy的1-9标度方法给出。
参考文档:数学建模笔记——评价类模型之熵权法 - 简书
层次分析法(AHP) - 知乎
Python学习笔记——熵权—TOPSIS - 知乎
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)