基于Python的数学建模

基本原理

  • 在信息论中,熵是对不确定性的一种度量
  • 不确定性越大,熵就越大,包含的信息量越大;不确定性越小,熵就越小,包含的信息量就越小。
  • 根据熵的特性,可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响(权重)越大。比如样本数据在某指标下取值都相等,则该指标对总体评价的影响为0,权值为0.
  • 熵权法是一种客观赋权法,因为它仅依赖于数据本身的离散性。

熵值法步骤

  1. 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)
  2. 指标的归一化处理:异质指标同质化
    • 由于各项指标的计量单位并不统一,因此在用它们计算综合指标前,先要进行标准化处理,即把指标的绝对值转化为相对值,从而解决各项不同质指标值的同质化问题。
    • 另外,正向指标和负向指标数值代表的含义不同(正向指标数值越高越好,负向指标数值越低越好),因此,对于正向负向指标需要采用不同的算法进行数据标准化处理:
    • 为了方便起见,归一化后的数据 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}xijmin{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

  1. 计算第 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

  2. 计算第 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 ej0;
      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=1npijln(pij),j=1,,m
  3. 计算信息熵冗余度:
    d j = 1 − e j , j = 1 , ⋯   , m d_{j}=1-e_{j}, \quad j=1, \cdots, m dj=1ej,j=1,,m

  4. 计算各项指标的权重:
    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=1ej,j=1,,mwj=j=1mdjdj,j=1,,m

  5. 计算样本的综合权重(加权后):

    • 其中, 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=1mwjxij,i=1,,n
  • 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
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐