python信息熵与信息增益

前言

最近在读几篇华为杯的优秀论文,都是关于数据预测相关的,准确来说是时间序列预测,在数据处理部分发现了一个有趣的内容“信息熵”,之前在周志华老师的西瓜书上决策树剪枝部分看到过,在数据降维的部分看到还是第一次,在另一篇文章中也用到了信息增益这个东西,两篇文章我都会放在参考中以便感兴趣的伙伴查看。

信息熵与信息增益

这里提到的都是相对连续的数据,并不是特征是类别的频率,具体可以参考其他文章。这一部分我就完全copy于论文中:“信息熵”理论:克劳德·艾尔伍德·香农(Claude Elwood Shannon)于 1948 年提出了“信息熵”理论。一般来说,某个指标的信息熵越小,计算出来的信息熵权重也就越大,相应提供的信息量越多,其在综合模型的重要程度也越大;相反,某个指标的信息越大,其所占信息权重则越小,提供的信息量也越少,在综合模型中所起到的作用也越小。其中,对于某项指标的一组数据,其信息熵权重的计算方式如下所示: p i j = Y i j / ∑ i = 1 n Y i j E j = − ln ⁡ − 1 ( n ) ∑ i = 1 n p i j ln ⁡ p i j W j = 1 − E j n − ∑ i = 1 n E i ( j = 1 , 2 , … , n ) p_{ij}=Y_{ij}/\sum_{i=1}^{n}Y_{ij}\\E_{j}=-\ln^{-1}(n)\sum_{i=1}^{n}p_{ij}\ln p_{ij}\\W_{j}=\frac{1-E_{j}}{n-\sum_{i=1}^{n}E_{i}}(j=1,2,\ldots,n) pij=Yij/i=1nYijEj=ln1(n)i=1npijlnpijWj=ni=1nEi1Ej(j=1,2,,n)其中, E j E_j Ej为第 j j j项指标的信息熵, n n n为样本总数, Y j Y_j Yj为该指标的第 j j j条样本数据。 W j W_j Wj是第 j j j个筛选后主要变量的信息熵权重。
第二个式子中的第一项的对数作者在计算中省略了,求和中的对数有时也可换成以2为底的;第三个式子在实际计算中也没有应用,而是使用了“信息熵占比”公式,在后续的代码中可以看到,计算结果相同。
信息增益部分也从论文中截取如下:

信息增益
这两部分对于数据处理中的作用也不同,信息熵是作为降维之后的验证,信息增益是降维的直接方法。

代码实现——信息熵计算

import pandas as pd  
import numpy as np  
    
file_path = '2012年.xls'   
data = pd.read_excel(file_path, header=0) 
data_array = data.values 
def cal_weight(value):  
     
    n_features = value.shape[1]  # 特征的数量  
    n_samples = value.shape[0]  # 样本的数量  
      
    # 初始化熵增益数组  
    g = np.zeros(n_features)  
    p = np.zeros_like(data_array, dtype=np.float64)
    e = np.copy(p)
    
    # 计算每个特征的熵  
    summ=np.sum(data_array,axis = 0) 
    for j in range(n_samples):
        for i in range(n_features):
            p[j][i] = value[j][i] / summ[i]
            p[j][i] = np.where(p[j][i] == 0, 1e-9, p[j][i])
            e[j][i]=(p[j][i] * np.log(p[j][i]))  
    ee = np.sum(e,axis = 0)
    for i in range(n_features):
        g[i] = 1 - ee[i]  
    
    w = g / np.sum(g)  
      
    return w   
  
# 计算权重  
w = cal_weight(data_array)
feature_names = data.columns   # 示例特征名  
w_df = pd.DataFrame(w, index=feature_names, columns=['权重'])  
  
print("#######权重:#######")  
print(w_df.sort_values(by="权重", ascending=False))

论文中所提供的代码并没有实现(有点乱码),中间的计算部分我又花费了好久才完成(即使公式非常简单),原因是有点太依赖语言大模型不肯自己动脑思考,中间也出现了好多问题:
1、在原始数据的计算过程中记过出现了nan值,原因是第二个式子中的对数计算, p i j p_{ij} pij会出现负的,这是由于数据中有正有负,可能论文中用于降维后的验证也有道理(降维后的数据恰好都是正值),但是如果有负值就不能用了吗,我也查询了一些方法可以调整:
最小值加1法:将所有数值转换成它们相对于最小值的偏移量,再加上一个足够大的常数(如最小值+1),使得所有的值都成为非负的。例如,如果最小值是-5,则将每个数变成 ( x + 6 ),再计算信息熵。
最小二乘归一化:将数据标准化到0到1之间,这可以通过将数据减去最小值并除以最大值减去最小值来实现,虽然结果不再是绝对值,但它保证了数据在分析过程中是正的。
对称化:如果数据分布在均值附近存在负值和正值的对称分布,可以选择平均值作为参考点,将数据转换为相对平均值的偏差形式,然后再计算信息熵。
2、信息熵计算公式中的第三个在实际计算中可以写的稍微简单一点。
最后得到的输出形式的代码参考于论文中的,得到的结果如图:输出结果

参考

两篇论文都是2022年华为杯E题的优秀论文,其中提到信息熵的编号为E22103350038;信息增益的为E22103040108,分别在29页和20页。下载链接如下:链接:论文下载
提取码:1234

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小沈不会泛函

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值