互信息法的原理详解

2024-01-12 15:52
文章标签 详解 原理 互信息

本文主要是介绍互信息法的原理详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 互信息法(上)
    • 互信息是什么
      • 从信息增益角度理解互信息
      • 从变量分布一致角度理解互信息
  • 卡方检验与离散变量的互信息法

互信息法(上)

尽管f_regression巧妙的构建了一个F统计量,并借此成功的借助假设检验来判断变量之间是否存在线性相关关系,但f_regression仍然存在较大局限,首当其冲当然是f_regression只能挖掘线性相关关系,也就是两个变量的同步变化关系,但除了线性关联关系外,变量之间存在其他类别的“关联关系”也是有助于模型建模,而其他类型的关系,无法被f_regression识别;其二就是由于离散变量(尤其是名义型变量)的数值大小是没有意义的,因此判断离散变量和其他变量的“线性关系”意义不大,因此f_regression只能作用于两个连续变量之间。综上所述,f_regression唯一适用的场景就是用于线性回归的连续变量特征筛选的过程中。而对于机器学习,针对于回归类问题,仅仅依靠f_regression进行连续型变量的特征筛选肯定是远远不够的。接下来我们就进一步介绍可以挖掘除了线性相关关系外的特征筛选方法:互信息法。

互信息是什么

从信息增益角度理解互信息

理解信息增益的求算过程,我们先了解一下信息熵。信息熵的计算公式:
H ( X ) = − ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) H(X) = -\sum^n_{i=1}p(x_i)log(p(x_i)) H(X)=i=1np(xi)log(p(xi))
其中, p ( x i ) p(x_i) p(xi)表示多分类问题中第 i i i个类别出现的概率, n n n表示类别总数,通常来说信息熵的计算都取底数为2,并且规定 l o g 0 = 0 log0=0 log0=0
假设有二分类数据集如下:

indexlabels
10
21
31
41

该数据集的信息增益为:
H ( X ) = − ( p ( x 1 ) l o g ( p ( x 1 ) ) + p ( x 2 ) l o g ( p ( x 2 ) ) ) = − ( 1 4 ) l o g ( 1 4 ) − ( 3 4 ) l o g ( 3 4 ) \begin{aligned} H(X) &= -(p(x_1)log(p(x_1))+p(x_2)log(p(x_2))) \\ &=-(\frac{1}{4})log(\frac{1}{4})-(\frac{3}{4})log(\frac{3}{4}) \end{aligned} H(X)=(p(x1)log(p(x1))+p(x2)log(p(x2)))=(41)log(41)(43)log(43)

-1/4 * np.log2(1/4) - 3/4 * np.log2(3/4)

在这里插入图片描述

#也可以借助scipy中的stats.entropy函数来完成信息熵的计算
scipy.stats.entropy([1/4, 3/4], base=2)#base等于2,表示log以2为底

在这里插入图片描述
如现有简单数组如下,在按照特征对标签进行分组后,各数据集的信息熵计算结果如下:

在这里插入图片描述

# 原数据集信息熵
ent_A = 0.918# 子数据集整体信息熵,各个子数据集信息熵加权求和
ent_B = 1/2 * 0.918 + 1/2 * 0#计算信息增益
gain = ent_A - ent_B
gain

在这里插入图片描述
而这也是ID 3决策树的基本建树流程,即找到最能够降低子数据集标签不纯度的特征对数据集进行划分,而这里的信息增益,其实也就是这个降低不纯度的量化的指标。

互信息的解释: 参考视频

所以从本质上来讲,互信息就是信息增益

所以为什么树模型以及以树模型为弱分类器的集成算法可以不进行特征筛选?
不难发现,原因是树模型的生长过程其实是会自动选取信息增益最大的列进行数据集划分(即树的生长)特征筛选的(CART树也有类似过程,只不过更换了信息熵为基尼系数)

互信息这一指标的实际作用,确实能够挑选出能有效帮助模型建模的特征。而互信息法的本质,我们也可以将其理解为一个剥离决策树模型训练、单纯只对每个特征进行互信息计算、然后根据互信息进行挑选特征的过程。

我们也可以借助sklearn中的相关函数来更加自动化的执行互信息的计算,对于上述分类变量的互信息计算过程,可以借助sklearn中评估函数的mutual_info_score来完成计算:

from sklearn.metrics import mutual_info_score
A = np.array([0, 0, 0, 1, 1, 1])
D = np.array([0, 1, 1, 0, 0, 0])
mutual_info_score(A, D)
mutual_info_score(D, A)

在这里插入图片描述

这里需要说明的两点是:

  1. mutual_info_score(A,D)和mutual_info_score(D,A)的计算结果是一样的,这是因为互信息具有对称性,用A解释D,也可以用D解释A;
  2. sklearn中互信息的计算是以e为底的

从变量分布一致角度理解互信息

在这里插入图片描述
假设有下面数据表:

特征A标签D
00
01
01
10
10
10
p_A0 = 1/2
p_A1 = 1/2
p_D0 = 2/3
p_D1 = 1/3p_A0D0 = 1/6
p_A0D1 = 1/3
p_A1D0 = 1/2
p_A1D1 = 0KL_AD = p_A0D0 * np.log(p_A0D0/(p_A0*p_D0)) + p_A0D1 * np.log(p_A0D1/(p_A0*p_D1)) + p_A1D0 * np.log(p_A1D0/(p_A1*p_D0))
KL_AD

在这里插入图片描述

A = np.array([0, 0, 0, 1, 1, 1])
D = np.array([0, 1, 1, 0, 0, 0])
mutual_info_score(D, A)

在这里插入图片描述
和信息增益最终计算结果完全一致。

卡方检验与离散变量的互信息法

在这里插入图片描述
首先也是最明显的一点,就是卡方检验能够给出明确的p值用于评估是否是小概率事件,而互信息法只能给出信息增益的计算结果,很多时候由于信息增益的计算结果是在0到最小信息熵之间取值,因此信息增益的数值在判断特征是否有效时并不如p值那么直观。

其次需要注意的是,卡方检验的p值源于假设检验统计量服从卡方分布,这种有假设分布的方法也被称为参数方法,而互信息法并不涉及任何假定的参数分布,因此是一种非参数方法。不难发现,参数方法是借助样本估计总体,然后根据总体进行推断的过程,而非参数方法则无需总体信息即可计算。尽管从方法理解层面来看非参数方法会更加简单,但这种“简单”所带来的代价,就是非参数方法无法对小样本进行合理的预估。

 卡方检验是会收到样本数量影响的,而此时卡方检验不敢下结论的原因或许并不是因为现在的A和D表现出来的关联性不够强,而是目前样本数量太少了(只有六条样本)。因此这里如果我们不改变A和D的数据分布,而仅仅将样本数量扩增至10倍,则卡方检验结果如下:在这里插入图片描述
能够发现,此时卡方检验认为当前数据情况下A1和D1相互独立就是一个非常小概率的事件了,即判断A1和D1存在显著的关联关系。但此时互信息的计算结果仍然不变。

而这将如何影响我们对这两种方法的选用呢?一般来说,对于小样本而言,卡方检验的结果可信度会高于互信息法,因此优先考虑卡方检验,而对于大样本而言,卡方检验和互信息法二者的结果其实并不会有特别大的差异,卡方检验的p值越小、互信息的值就会越大、二者关联度就越高。对于大样本数据,若最终采用模型融合策略进行建模,则最好采用不同的特征筛选方法训练不同模型,以期能达到更好的融合效果。最后,需要强调的是,如果分类变量样本偏态非常严重,也会影响互信息的结果,但不会影响卡方检验结果。

这篇关于互信息法的原理详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/598370

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc