最大信息系数(Maximum Information Coefficient,MIC)最全介绍

0前前言

一门课的作业,到处搜集了很多信息,所以干脆上传,作为第一篇博文。有一点不太方便的是公式没有办法直接复制,所以截了很多图。

1前言

图1的源数据集,来自世界卫生组织(WHO)及其合作伙伴的社会、经济、卫生、政治领域上的数据(共357个变量)。图1散点图的横坐标是人均收入,而纵坐标是成年女性的肥胖率,可以看到该散点图中呈现的趋势不止一种,T1是是线性的,而T2是抛物线。Pearson相关系数是常规的相关系数度量方法。依据图2,该组数据的相关系数在点F,可以看到点F的Pearson相关系数接近0,也就是说人均收入和成年女性的肥胖率具有线性相关性可能较低。根据实际调研发现,有一组太平洋岛国的女性体重与人均收入具有较强的线性相关关系,通过深入调查发现,该岛屿上女性体重是地位的象征,而世界上其他大多是国家遵循趋势T2,是抛物线关系。这个时候我们在看图2横坐标,可以发现,F点的MIC值在0.6左右,也就是说MIC度量方法检验到了人均收入和成年女性的肥胖率是具有相关关系的,MIC方法是如何做到的呢?接下来会一一揭晓。

0fc863bbd40544c983325763364d2296.pnga829aae51a4b4709b7cfa9a413e15be0.png

图1

图2

在信息爆炸的当今社会,单靠人力已经不能在无穷无尽的数据中有效的捕获信息。数据挖掘这一学科的兴起也预示着在各行业即将展开一场数据革命。在大数据集中识别两个变量的相关关系越来越重要。数据的相关性又分为线性相关和非线性相关。对于线性相关关系,有很多系数可以度量,比如皮尔逊相关系数、斯皮尔曼相关系数。尽管斯皮尔曼相关系数和kendall相关系数可以描述一些简单的非线性相关。

在实际研究中出现了很多其他非线性相关的关系,学者提出了度量方法弥补过去线性相关系数无法识别非线性关系的缺陷,比如相关比例(Correlation Ratios)、最大相关系数(Maximal Correlation)、距离相关(Distance Correlation)、HHG、还有一些基于信息论的指标比如最大信息系数(maximal information coefficient)等。

本次将着重介绍最大信息系数,接下来将介绍一些信息论的相关概念。

2.概念

2.1互信息(Mutual Information)

互信息是一种用于衡量两个随机变量之间相关性的指标,它可以用来度量一个随机事件的出现对另一个随机事件出现概率的影响程度。在信息论中,互信息被定义为两个随机变量之间的信息量的共享量,它可以用来衡量两个随机变量之间的相关性。互信息最常用的单位是bit(对数使用的底的不同,单位会不同,奈特,哈特)。

bf0034bb58f34efeafadf68da6c3dea0.png

d0b57193bd8f4c5cae8d3827508fe0f9.png

图3

其中H(X)和H(Y) 是边缘熵,H(X|Y)和H(Y|X)是条件熵,而H(X,Y)是X和Y的联合熵。注意到这组关系和并集、差集和交集的关系类似,用Venn图表示:如图3。

756559c8e4e94e1fae0ac048e41ae1eb.png 表示知道随机变量Y ,随机变量X 熵的减少。(信息熵是信息量的期望)

2.2最大信息系数(Maximum Information Coefficient,MIC)

c8f4cebafa2c4e73949079f935558fb8.png

 

2.3偏最大信息系数(Partial Maximum Information Coefficient)

6dfb501b357348868b95001f321be434.png

440e4c397b834fbdacaeedc357dd38f6.png

e7e6f386d6de4b6d99ff95a4917195e1.png

87f0f7efac8f4fcf8855d661cfa347b4.png

3.最大信息系数计算

随机数组生成,本例中依据a850d3faaddd45a7b8f0501881c79aa2.png 生成随机数,其中有4d5026267b534f5995f5ab39e07aac6a.png 随机扰动项,a89504411aab409784ba9ca0a6c92d9f.png 服从标准正态分布。生成的随机数组如下所示。

x

y

1.92

4.65

9.20

13.25

8.44

13.11

1.20

4.11

9.70

14.64

6.24

6.00

6.56

10.83

1.03

4.24

3.45

6.35

2.90

7.64

MIC计算分为三个步骤:

(1)给定5f772c7f865344aeb2b0d5b98beaa732.png0e0dbb0d1f36493ea3c27c1a81b287d0.png 构成的散点图进行ca5648270f2347edb68a9f53f3d456ef.pnge9e6da5f3efa43e4bd7aa36926173f41.png 行网格化,并求出最大的互信息值;

(2)对最大的互信息值进行归一化;

(3)选择不同尺度下互信息的最大值作为MIC值

3.1计算最大互信息值

给定a82564b4c428461db6e7afaab9b58c5a.png ,对53c7c073d2f5465899c17d16e3372f8b.png 构成的散点图进行fd64d4ec13ce4b18a3bfb725807c4e4d.pngec55c5b8a05f4a3ba6592b32fa7ae75e.png 行网格化,并求出最大的互信息值,如上图所示:

在给定a5624fc4210f451daab1e1560b9428bc.png867f917277a0448c9155cb4e24333faa.png 后,可以得出多种不同的网格化方案。我们需要从这些不同的网格化方案中找到使互信息最大的网格化方案。在本例中,假设b401bfc3400c45659d9f8479f8170418.png ,举例以下红、篮、灰三种网格化方案,分别计算每个网格化方案对应的互信息值,找出使互信息值最大的网格化方案。

那么,给定了某个网格化方案后,如何计算其对应的互信息值呢?这里以上图中红色的网格化方案为例进行说明。红色网格化方案将所有数据点分为四个区域:左上,右上,左下,右下。每个区域对应的数据点数量为1,4,4,1。将数据点数归一化得到四个区域的数据点频率,分别为0.1,0.4,0.4,0.1。也就是说,此时,X有两种取值:左和右,Y有两种取值:上和下。P(X=左,Y=上)=0.1,P(X=右,Y=上)=0.4,P(X=左,Y=下)=0.4,P(X=右,Y=下)=0.1。并且,P(X=左)=0.5,P(X=右)=0.5,P(Y=上)=0.5,P(Y=下)=0.5。根据互信息计算公式,得到X和Y在这种分区下的互信息为:

f79c398817e947378f9a07c868c768b6.png

计算完红色网格方案的互信息后,以此类推,再分别计算出其他网格方案的互信息,最后比较哪种方案得到的互信息值最大,即为该(i,j) 取值下的最大的互信息值。

3.2对最大的互信息值进行归一化

根据公式,将得到的最大信息数除以abe8cddd46234d9f9c80054972156a99.png ,即为归一化。

3.3选择不同尺度下互信息的最大值作为MIC值

 

3.4最大信息系数的代码实现

from __future__ import division

import numpy as np

import matplotlib.pyplot as plt

from minepy import MINE

def mysubplot(x, y, numRows, numCols, plotNum,

              xlim=(-4, 4), ylim=(-4, 4)):

 

    r = np.around(np.corrcoef(x, y)[0, 1], 1)

    mine = MINE(alpha=0.6, c=15)

    mine.compute_score(x, y)

    mic = np.around(mine.mic(), 1)

    ax = plt.subplot(numRows, numCols, plotNum,

                     xlim=xlim, ylim=ylim)

    ax.set_title('Pearson r=%.1f\nMIC=%.1f' % (r, mic),fontsize=10)

    ax.set_frame_on(False)

    ax.axes.get_xaxis().set_visible(False)

    ax.axes.get_yaxis().set_visible(False)

    ax.plot(x, y, ',')

    ax.set_xticks([])

    ax.set_yticks([])

    return ax

 

def rotation(xy, t):

    return np.dot(xy, [[np.cos(t), -np.sin(t)],

                       [np.sin(t), np.cos(t)]])

 

def mvnormal(n=1000):

    cors = [1.0, 0.8, 0.4, 0.0, -0.4, -0.8, -1.0]

    for i, cor in enumerate(cors):

        cov = [[1, cor],[cor, 1]]

        xy = np.random.multivariate_normal([0, 0], cov, n)

        mysubplot(xy[:, 0], xy[:, 1], 3, 7, i+1)

 

def rotnormal(n=1000):

    ts = [0, np.pi/12, np.pi/6, np.pi/4, np.pi/2-np.pi/6,

          np.pi/2-np.pi/12, np.pi/2]

    cov = [[1, 1],[1, 1]]

    xy = np.random.multivariate_normal([0, 0], cov, n)

    for i, t in enumerate(ts):

        xy_r = rotation(xy, t)

        mysubplot(xy_r[:, 0], xy_r[:, 1], 3, 7, i+8)

 

def others(n=1000):

    x = np.random.uniform(-1, 1, n)

    y = 4*(x**2-0.5)**2 + np.random.uniform(-1, 1, n)/3

    mysubplot(x, y, 3, 7, 15, (-1, 1), (-1/3, 1+1/3))

   

    y = np.random.uniform(-1, 1, n)

    xy = np.concatenate((x.reshape(-1, 1), y.reshape(-1, 1)), axis=1)

    xy = rotation(xy, -np.pi/8)

    lim = np.sqrt(2+np.sqrt(2)) / np.sqrt(2)

    mysubplot(xy[:, 0], xy[:, 1], 3, 7, 16, (-lim, lim), (-lim, lim))

 

    xy = rotation(xy, -np.pi/8)

    lim = np.sqrt(2)

    mysubplot(xy[:, 0], xy[:, 1], 3, 7, 17, (-lim, lim), (-lim, lim))

   

    y = 2*x**2 + np.random.uniform(-1, 1, n)

    mysubplot(x, y, 3, 7, 18, (-1, 1), (-1, 3))

   

    y = (x**2 + np.random.uniform(0, 0.5, n)) * \

        np.array([-1, 1])[np.random.random_integers(0, 1, size=n)]

    mysubplot(x, y, 3, 7, 19, (-1.5, 1.5), (-1.5, 1.5))

 

    y = np.cos(x * np.pi) + np.random.uniform(0, 1/8, n)

    x = np.sin(x * np.pi) + np.random.uniform(0, 1/8, n)

    mysubplot(x, y, 3, 7, 20, (-1.5, 1.5), (-1.5, 1.5))

 

    xy1 = np.random.multivariate_normal([3, 3], [[1, 0], [0, 1]], int(n/4))

    xy2 = np.random.multivariate_normal([-3, 3], [[1, 0], [0, 1]], int(n/4))

    xy3 = np.random.multivariate_normal([-3, -3], [[1, 0], [0, 1]], int(n/4))

    xy4 = np.random.multivariate_normal([3, -3], [[1, 0], [0, 1]], int(n/4))

    xy = np.concatenate((xy1, xy2, xy3, xy4), axis=0)

    mysubplot(xy[:, 0], xy[:, 1], 3, 7, 21, (-7, 7), (-7, 7))

 

plt.figure(facecolor='white')

mvnormal(n=800)

rotnormal(n=200)

others(n=800)

plt.tight_layout()

plt.show()

d27e72001da34f11be257a27d3e9ada3.png

4.最大信息系数特点

4.1最大信息系数性质

3b62f0c908674a039189bb23a59e6aee.png

4.2最大信息系数特点

MIC具有稳健性,不受异常值的影响,相关系数易受异常值的影响。

184d8c35cfb045f894a0f9f942c1db02.png

MIC具有普适性、公平性。

普适性:是指在样本量足够大(包含了样本的大部分信息)时,能够捕获各种各样的关联,而不限定于特定的函数类型(如线性函数、指数函数或周期函数),或者说能均衡覆盖所有的函数关系。一般变量之间的复杂关系不仅仅是通过单独一个函数就能够表示,而是需要叠加函数来表现。不同类型的关联关系其起点应当是接近的。只要满足某函数关系,其MIC值应该是1。

d9c403332f9542c49d650fe5b1ff0e82.png

公平性:是指在样本量足够大时能为不同类型单噪声程度相似的相关关系给出相近的系数。例如,对于一个充满相同噪声的线性关系和一个正弦关系,一个好的评价算法应该给出相同或相近的相关系数。而对于公平性较好的比较方法,随着噪音的增加,不同类型关联关系函数变化应当是相近的。

论文原作者将MIC与互信息的结果进行了对比,发现互信息更善于捕获强线性相关关系,而对于MIC值较高的非线性关系,互信息给出的值较低。

25493724d0db4eebaac745d07df9605e.png

e132920d38f4401c83794193f947525c.png

 

5.最大信息系数应用

国内自2013年开始,出现了MIC在不同领域应用的文献:蒋杭进将MIC应用到了脑网络分析中;为了有效的进行人脸特征选择,战泉茹利用MIC作为有效判据应用到了特征选择的单独最优特征组合法中;魏中强等人利用MIC与条件独立性测试,提出了一种新的贝叶斯网络结构学习算法(MICVO);高凤将MIC应用到了股市关联度分析上,捕获到了上证综合指数与深证综合指数具有较强的相关关系(0.8141)。2023年,任佳等、张逸豪等将将最大相关系数应用于工业过程故障诊断过程(与神经网络、支持向量机等结合)。

应用1:特征选择器:针对特征数量巨大的数据集,利用MIC算法计算相关性更高的前N个特征,利用选取出来的N个特征+算法(支持向量机+XGboost+神经网络等)进行预测。

应用2:模型选择方法:最小化残差与解释变量之间的最大信息系数值。

6.MIC的局限性(来自人工智能回答,可能有误)

主要可以从以下几个方面来谈MIC的局限性:

1. MIC更擅长判断存在关系,而不擅长确定关系的具体形式。MIC可以告诉我们两个变量是否存在关联,但无法判定这种关联是线性的、指数的还是其他类型。

2. MIC对变量类型和数据分布非常敏感。如果变量类型改变,如从连续转换为分类,MIC值会大幅波动。同理,如果数据分布改变,MIC值也不稳定。

3. MIC无法检验因果关系。高MIC值仅代表两个变量存在统计关联,但不能判断其中一个变量是另一个变量的原因。确定因果关系需要进行更多实验设计。

4. MIC对离群点非常敏感。少数极端异常值会显著影响MIC值。需要检验数据并去除离群点,以提高MIC稳健性。

5. MIC的计算结果依赖于“箱子”的数量,不同的箱子数会导致MIC值差异很大。选择箱子数需要经验和重复试验。

6. MIC无法给出具体的预测模型。MIC只能度量关系强度,不能用于预测一个变量基于另一个变量的数值。

7. MIC对大数据集的计算复杂度高,可扩展性和效率较差。

综上,MIC适合用于快速发现变量潜在关系,但不适合建立精确预测模型。实际应用中,MIC常与其他统计学、机器学习手段配合使用,以发挥各自的优势。

7.其他补充

Reshef等在2011年发布的关于MIC在几个大数据集上的应用结果,以及提出了MIC具有公平性和普适性等特点,使MIC广泛应用于很多行业和研究中。但是也有学者对文章中提出了MIC的公平性提出质疑,也就是原文章中提出的在样本量足够大时能为不同类型单噪声程度相似的相关关系给出相近的系数。也就是这一组模拟数据所体现的信息。但是Kinney和Atwal实证发现,当数据点在1000及以下时,如A图,这些MIC值表现出一定的分散性,但参考文献1假定这是由于模拟数据集的有限大小造成的,而不是MIC的任何固有的f相关偏差。然而,如图B所示,当模拟数据点的数量增加到5000时,MIC值中显著的f相关偏差变得明显。当噪声值介于0.6到0.8之间时,这种偏差尤其强烈。这个还需要更进一步探究。

bab802a8bc58446ba825b76e2d634c1a.png

8d20750b71024563bc8db5f9a3ca7951.png

参考文献

[1]Reshef, D. N., Reshef, Y. A., Finucane, H. K., Grossman, S. R., McVean, G., Turnbaugh, P. J., … Sabeti, P. C. (2011). Detecting Novel Associations in Large Data Sets. Science, 334(6062), 1518–1524.

[2]Kinney, J. B., & Atwal, G. S. (2014). Equitability, mutual information, and the maximal information coefficient. Proceedings of the National Academy of Sciences, 111(9), 3354–3359.

[3]蒋杭进. 最大信息系数及其在脑网络分析中的应用[D].中国科学院研究生院(武汉物理与数学研究所),2014.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值