传感数据分析——Entropy Weight Method (熵权法)


前言

熵是对不确定信息的度量。对于多传感数据分析而言,传感数据中必然存在不确定的信息和确定的信息。当数据中包含的不确定信息越多,熵也就越大,反之亦然。我们可以利用熵权法对传感数据中重要信息提取,并输出一个综合性的评估指标。


本文正文内容

一、基础理论

基本概念

① 归一化:绝对量==>相对量
计算负向指标:
z i j ′ = z i j − z min ⁡ z max ⁡ − z min ⁡ \begin{equation}z_{ij}^{^{\prime}}=\frac{z_{ij}-z_{\min}}{z_{\max}-z_{\min}}\end{equation} zij=zmaxzminzijzmin
计算正向指标:
z i j ′ = z max ⁡ − z i j z max ⁡ − z min ⁡ \begin{equation}z_{ij}^{^{\prime}}=\frac{z_{\max}-z_{ij}}{z_{\max}-z_{\min}}\end{equation} zij=zmaxzminzmaxzij
②计算比重,这里的比重指的是不同的指标对应不同的样本数量的比重,可以当作熵计算中需要的概率大小:
x i j = z i j ′ / ∑ i = 1 N z i j ′ \begin{equation}x_{ij}=z_{ij}^{'}/\sum_{i=1}^{N}z_{ij}^{'}\end{equation} xij=zij/i=1Nzij
③求熵值, f E n f_{En} fEn泛指计算出熵值的公式:
e j = f E n ( x i j ) , i ∈ [ 1 , N ] , e j ∈ [ 0 , 1 ] \begin{equation}e_j=f_{En}(x_{ij}),i\in[1,N],e_j\in[0,1]\end{equation} ej=fEn(xij),i[1,N],ej[0,1]
④计算信息效用值,计算每个数据对应的信息效用值。信息效用值就是差异系数,
信息效用值越大,数据携带的特征越多:
d j = 1 − e j \begin{equation}d_j=1-e_j\end{equation} dj=1ej
⑤计算信息效用值归一化的值,得到每个指标的权重大小:
ω j = d j / ∑ j = 1 N d j \begin{equation}\omega_j=d_j/\sum_{j=1}^Nd_j\end{equation} ωj=dj/j=1Ndj
⑥加权求和,计算得到熵权法输出值(综合评价指标):
S i = ∑ j = 1 M ω j x i j , i = 1 , 2 , ⋯   , N \begin{equation}S_i=\sum_{j=1}^M\omega_jx_{ij},i=1,2,\cdots,N\end{equation} Si=j=1Mωjxij,i=1,2,,N
z i j z_{ij} zij是传感器数据中第 i i i 行和第 j j j 列的原始数据。式(3)中, x i j x_{ij} xij是比重。式(4)中, e e e x i j x_{ij} xij 的熵值。 f E n f_{En} fEn泛指计算出熵值的公式。式(5)~(6)中, d d d是的信息效用值,也称信息冗余度。
ω \omega ω 是 EWM 得到的每列数据对应的权重, S S S 是 熵权法 输出的结果, M M M 是传感器数据中总的列数, N N N 是传感器数据中总的行数。
对于常用的信息熵而言,式(4)可以表示为:
f I n E n j = − 1 ln ⁡ N ∑ i = 1 N x i j   l n x i j , f I n E n j ∈ [ 0 , 1 ] \begin{equation}f_{InEn_j}=-\frac1{\ln N}\sum_{i=1}^Nx_{ij}\mathrm{~ln}x_{ij},f_{InEn_j}\in[0,1]\end{equation} fInEnj=lnN1i=1Nxij lnxij,fInEnj[0,1]
后续后会补上:近似熵(Approximate Entropy,ApEn)、样本熵(Sample Entropy,SampEn)、模糊熵(Fuzzy Entropy,FuzzyEn)和排列熵(Permutation Entropy,PeEn)。

==========================================
相关公式叙述可以见大佬的博客:【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?

二、运行环境

系统: Windows 10 / Ubuntu 20.04
编程语言: Python 3.8
文本编译器: Vscode
所需库:pandas >= 0.23.0, matplotlib >= 2.2.2 , numpy >= 1.19.5

三、使用步骤

1.引入库

代码如下(示例):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

2.读入数据

代码如下(示例):

# 导入数据
    data=pd.read_excel("dataset/dataset_test1.xlsx", sheet_name=0,header=0,index_col=0)
    # 保存路径
    save_path = './result/'
    # 调用熵权法函数处理数据
    entropy_weight_method(data, save_path)

该处读取dataset文件夹下的数据,可以修改为你目录下的数据文件。


3.熵权法

代码如下(示例):

def entropy_weight_method(data, save_path):
    """
    熵权法函数:
    输入:
    data: pd.dataFrame格式数据
    save_path: 熵权法输出值保存目录
    无返回值
    """
    #获取行数m和列数n
    m,n=data.shape  
    print("行数:", m, "列数: ", n)
    #标准化矩阵
    Y_ij=min_max_matrix(data, n)  
    #新建空矩阵
    none_ij = [[0.0] * n for i in range(m)]  
    #熵值
    E_j = entropy_j(Y_ij, none_ij,m, n) 
    #计算差异系数 
    G_j = 1 - E_j  
    #计算权重  
    W_j = G_j / sum(G_j)   
    # 转为pd.Series格式
    Weights= pd.Series(W_j, index=data.columns, name='指标权重')
    # 保存到excel
    Weights.to_excel(save_path + "Entropy_weight.xlsx",sheet_name='Weights')
    # 原数据×权重=最终结果
    Y_ij = np.array(Y_ij)
    Z_ij = np.array(none_ij) 
    score = np.array([[0.0] for i in range(m)])
    for i in range(m):
        temp_sum = 0
        for j in range(n):
            #计算加权标准化矩阵Z_ij
            Z_ij[i][j]=Y_ij[i][j]*W_j[j]  
            temp_sum += Z_ij[i][j]
        score[i] = temp_sum
    # 保存熵权法输出值
    score_pd = pd.DataFrame(score, columns=['熵权法结果'])  
    score_pd.to_excel(save_path + "score_entropy.xlsx", sheet_name="EWMscores")
    # 绘图
    plt.figure(figsize=(16,9))
    plt.plot(score)
    plt.legend(['EWM Scores'])
    plt.title("Entropy Weight Method Test", fontsize=18)
    plt.savefig("")
    plt.show()

def min_max_matrix(data1, n): 
    """
    矩阵标准化(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

结果图
在这里插入图片描述


总结

以上就是本节对传感数据进行熵权法计算输出综合评价值的内容,本文简单介绍了传感数据分析中熵权法基本公式及Python的实现(改为自己的数据集即可),对entropy_j函数的实现,可见传感数据分析-Entropy Weight Method (熵权法)
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐