Python数学建模 熵权法/熵值法
基本原理在信息论中,熵是对不确定性的一种度量。不确定性越大,熵就越大,包含的信息量越大;不确定性越小,熵就越小,包含的信息量就越小。根据熵的特性,可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响(权重)越大。比如样本数据在某指标下取值都相等,则该指标对总体评价的影响为0,权值为0.熵权法是一种客观赋权法,因为它仅依赖
文章目录
基于Python的数学建模
- Github仓库:Mathematical-modeling
基本原理
- 在信息论中,熵是对不确定性的一种度量。
- 不确定性越大,熵就越大,包含的信息量越大;不确定性越小,熵就越小,包含的信息量就越小。
- 根据熵的特性,可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响(权重)越大。比如样本数据在某指标下取值都相等,则该指标对总体评价的影响为0,权值为0.
- 熵权法是一种客观赋权法,因为它仅依赖于数据本身的离散性。
熵值法步骤
- 对 n n n个样本, m m m个指标,则 x i j x_{ij} xij为第 i i i个样本的第 j j j个指标的数值 ( i = 1 , ⋯ , n ; j = 1 , ⋯ , m ) (i=1,\cdots, n; j=1,\cdots,m) (i=1,⋯,n;j=1,⋯,m)
- 指标的归一化处理:异质指标同质化
- 由于各项指标的计量单位并不统一,因此在用它们计算综合指标前,先要进行标准化处理,即把指标的绝对值转化为相对值,从而解决各项不同质指标值的同质化问题。
- 另外,正向指标和负向指标数值代表的含义不同(正向指标数值越高越好,负向指标数值越低越好),因此,对于正向负向指标需要采用不同的算法进行数据标准化处理:
- 为了方便起见,归一化后的数据 x i j ′ x_{ij}^{'} xij′仍记为 x i j x_{ij} xij。
x i j ′ = x i j − min { x 1 j , … , x n j } max { x 1 j , … , x r j } − min { x 1 j , … , x n j } \begin{array}{l} x_{i j}^{\prime}=\frac{x_{i j}-\min \left\{x_{1 j}, \ldots, x_{n j}\right\}}{\max \left\{x_{1 j}, \ldots, x_{r j}\right\}-\min \left\{x_{1 j}, \ldots, x_{n j}\right\}} \end{array} xij′=max{x1j,…,xrj}−min{x1j,…,xnj}xij−min{x1j,…,xnj}
x i j ′ = max { x 1 j , … , x n j } − x i j max { x 1 j , … , x n j } − min { x 1 j , … , x n j } \begin{array}{l} x_{i j}^{\prime}=\frac{\max \left\{x_{1 j}, \ldots, x_{n j}\right\}-x_{i j}}{\max \left\{x_{1 j}, \ldots, x_{n j}\right\}-\min \left\{x_{1 j}, \ldots, x_{n j}\right\}} \end{array} xij′=max{x1j,…,xnj}−min{x1j,…,xnj}max{x1j,…,xnj}−xij
-
计算第 j j j项指标下第 i i i个样本值占该指标的比重:
p i j = x i j ∑ i = 1 n x i j , i = 1 , ⋯ , n , j = 1 , ⋯ , m p_{i j}=\frac{x_{i j}}{\sum_{i=1}^{n} x_{i j}}, \quad i=1, \cdots, n, j=1, \cdots, m pij=∑i=1nxijxij,i=1,⋯,n,j=1,⋯,m -
计算第 j j j项指标的熵值:
- 其中, k = 1 l n ( n ) > 0 k=\frac{1}{ln(n)}>0 k=ln(n)1>0 满足 e j ≥ 0 e{j} \ge 0 ej≥0;
e j = − k ∑ i = 1 n p i j ln ( p i j ) , j = 1 , ⋯ , m e_{j}=-k \sum_{i=1}^{n} p_{i j} \ln \left(p_{i j}\right), \quad j=1, \cdots, m ej=−ki=1∑npijln(pij),j=1,⋯,m
- 其中, k = 1 l n ( n ) > 0 k=\frac{1}{ln(n)}>0 k=ln(n)1>0 满足 e j ≥ 0 e{j} \ge 0 ej≥0;
-
计算信息熵冗余度:
d j = 1 − e j , j = 1 , ⋯ , m d_{j}=1-e_{j}, \quad j=1, \cdots, m dj=1−ej,j=1,⋯,m -
计算各项指标的权重:
d j = 1 − e j , j = 1 , ⋯ , m w j = d j ∑ j = 1 m d j , j = 1 , ⋯ , m d_{j}=1-e_{j}, \quad j=1, \cdots, mw_{j}=\frac{d_{j}}{\sum_{j=1}^{m} d_{j}}, \quad j=1, \cdots, m dj=1−ej,j=1,⋯,mwj=∑j=1mdjdj,j=1,⋯,m -
计算样本的综合权重(加权后):
- 其中, x i j x_{ij} xij为标准化后的数据。
s i = ∑ j = 1 m w j x i j , i = 1 , ⋯ , n s_{i}=\sum_{j=1}^{m} w_{j} x_{i j}, \quad i=1, \cdots, n si=j=1∑mwjxij,i=1,⋯,n
- 其中, x i j x_{ij} xij为标准化后的数据。
- GitHub Flavored Markdown不支持Latex渲染,请下载后使用VScode或Obsidian等软件配套食用
- 参考来源:知乎:熵权法确定权重
Python代码实现
import numpy as np
def MinMaxNormalized(x,type,ymin=0,ymax=1):
"""
实现正向或负向指标MinMax归一化,返回归一化后的数据矩阵;
x:为原始数据矩阵, 一行代表一个样本, 每列对应一个指标;
type:设定正向指标1,负向指标2;
ymin,ymax:归一化的区间端点,即归一化时将数据缩放到(ymin,ymax)的范围内,默认应设置为[0,1];
"""
n, m = x.shape
y = np.zeros((n, m))
xmin = np.min(x,axis=0)
xmax = np.max(x,axis=0)
if type == 1:
for j in range(m):
y[:,j] = (ymax-ymin)*(x[:,j]-xmin[j]) / (xmax[j]-xmin[j])+ymin
elif type == 2:
for j in range(m):
y[:,j] = (ymax-ymin)*(xmax[j]-x[:,j]) / (xmax[j]-xmin[j])+ymin
return y
def Entropy_Weight_Method(x,ind,ymin=0.0001,ymax=0.9999):
"""熵权法(EWM)
输入变量
x: 原始数据矩阵, 一行代表一个样本, 每列对应一个指标;
ind: 指示向量,指示各列正向指标还是负向指标,1表示正向指标,2表示负向指标;
输出变量
Y:归一化后的数据
s:综合加权评分
w: 各指标权重;
"""
# n个样本, m个指标
n,m = x.shape
# 数据的归一化处理
# 归一化结果
Y = np.zeros((n, m))
for i in range(m):
if ind[i] == 1: #正向指标归一化
Y[:,i] = MinMaxNormalized(x[:,i].reshape(-1,1),1,ymin,ymax).flatten()
elif ind[i] == 2: #负向指标归一化
Y[:,i] = MinMaxNormalized(x[:,i].reshape(-1,1),2,ymin,ymax).flatten()
# 计算第m项指标下第m个样本值占该指标的比重:比重P(i,j)
P = np.zeros((n, m))
for i in range(n):
for j in range(m):
P[i,j] = Y[i,j] / np.sum(Y[:,j])
# 第j个指标的熵值e(j)
e = np.zeros((1,m))
# 其中k = 1/ln(n)
k= 1/np.log10(n)
for j in range(m):
e[0,j] = -k * np.sum(P[:,j] * np.log10(P[:,j]))
# 计算信息熵冗余度
d = np.ones_like(e)-e
# 计算各项指标的权重
w = d / np.sum(d)
# 计算该样本的综合加权评分
s = np.sum(w * Y,axis=1).reshape(-1,1)
return Y,s, w
更多推荐
所有评论(0)