选自FreeCoderCamp

作者:Peter Gleeson

机器之心编译

参与:陈韵竹、程耀彤、刘晓坤

原文链接:https://medium.freecodecamp.org/how-machines-make-predictions-finding-correlations-in-complex-data-dfd9f0d87889

本文为机器之心编译,转载请联系公众号获得授权。
本文分享自微信公众号 - 机器之心(almosthuman2014)

原文出处及转载信息见文内详细说明,如有侵权,请联系后台删除

皮尔逊相关系数 PCC

  • 皮尔逊相关系数(PCC, 或者 Pearson’s r)是一种广泛使用的线性相关性的度量,它通常是很多初级统计课程的第一课。从数学角度讲,它被定义为「两个向量之间的协方差,通过它们标准差的乘积来归一化」。

  • 两个成对的向量之间的协方差是它们在均值上下波动趋势的一种度量。也就是说,衡量一对向量是否倾向于在各自平均值的同侧或相反。

def mean(x):return sum(x)/len(x)
def covariance(x,y):calc = []for i in range(len(x)):xi = x[i] - mean(x)yi = y[i] - mean(y)calc.append(xi * yi)return sum(calc)/(len(x) - 1)
a = [1,2,3,4,5] ; b = [5,4,3,2,1]
print(covariance(a,b))
  • 协方差的计算方法是从每一对变量中减去各自的均值。然后,将这两个值相乘。

  • 如果都高于(或都低于)均值,那么结果将是一个正数,因为正数 × 正数 = 正数;同样的,负数 × 负数 = 正数。
    如果在均值的不同侧,那么结果将是一个负数(因为正数 × 负数 = 负数)。
    一旦我们为每一对变量都计算出这些值,将它们加在一起,并除以 n-1,其中 n 是样本大小。这就是样本协方差。

  • 如果这些变量都倾向于分布在各自均值的同一侧,协方差将是一个正数;反之,协方差将是一个负数。这种倾向越强,协方差的绝对值就越大。

  • 如果不存在整体模式,那么协方差将会接近于零。这是因为正值和负值会相互抵消。

  • 最初,协方差似乎是两个变量之间「关系」的充分度量。但是,请看下面的图:

  • 看起来变量之间有很强的关系,对吧?那为什么协方差这么小呢(大约是 0.00003)?

  • 这里的关键是要认识到协方差是依赖于比例的。看一下 x 和 y 坐标轴——几乎所有的数据点都落在了 0.015 和 0.04 之间。协方差也将接近于零,因为它是通过从每个个体观察值中减去平均值来计算的。

  • 为了获得更有意义的数字,归一化协方差是非常重要的。方法是将其除以两个向量标准差的乘积。

import math
def stDev(x):variance = 0for i in x:variance += (i - mean(x) ** 2) / len(x)return math.sqrt(variance)
def Pearsons(x,y):cov = covariance(x,y)return cov / (stDev(x) * stDev(y))
  • 这样做的原因是因为向量的标准差是是其方差的平方根。这意味着如果两个向量是相同的,那么将它们的标准差相乘就等于它们的方差。

  • 有趣的是,两个相同向量的协方差也等于它们的方差。
  • 因此,两个向量之间协方差的最大值等于它们标准差的乘积(当向量完全相关时会出现这种情况)。这将相关系数限制在 -1 到 +1 之间。

皮尔逊系数统计显著性?

  • 正如频率统计一样,重要的是询问从给定样本计算的检验统计量实际上有多重要。Pearson’s r 也不例外。

  • 不幸的是,PCC 估计的置信区间不是完全直接的。

  • 这是因为 Pearson’s r 被限制在 -1 和 +1 之间,因此不是正态分布的。而估计 PCC,例如 +0.95 之上只有很少的容错空间,但在其之下有大量的容错空间。

  • 幸运的是,有一个解决方案——用一个被称为 Fisher 的 Z 变换的技巧:

  1. 像平常一样计算 Pearson’s r 的估计值。
  2. 用 Fisher 的 Z 变换将 r→z,用公式 z = arctanh® 完成。
  3. 现在计算 z 的标准差。幸运的是,这很容易计算,由 SDz = 1/sqrt(n-3) 给出,其中 n 是样本大小。
  4. 选择显著性阈值,alpha,并检查与此对应的平均值有多少标准差。如果取 alpha = 0.95,用 1.96。
  5. 通过计算 z +(1.96 × SDz) 找到上限,通过计算 z - (1.96 × SDz) 找到下限。
  6. 用 r = tanh(z) 将这些转换回 r。
  7. 如果上限和下限都在零的同一侧,则有统计显著性!
r = Pearsons(x,y)
z = math.atanh(r)
SD_z = 1 / math.sqrt(len(x) - 3)
z_upper = z + 1.96 * SD_z
z_lower = z - 1.96 * SD_z
r_upper = math.tanh(z_upper)
r_lower = math.tanh(z_lower)

皮尔逊相关系数小结

  • Pearson’s r 只适用于线性数据。

  • 看下面的图。它们清楚地展示了一种看似非随机的关系,但是 Pearson’s r 非常接近于零。

  • 原因是因为这些图中的变量具有非线性关系。

  • 我们通常可以将两个变量之间的关系描绘成一个点云,分散在一条线的两侧。点云的分散度越大,数据越「嘈杂」,关系越弱。

  • 然而,由于它将每个单独的数据点与整体平均值进行比较,所以 Pearson’s r 只考虑直线。这意味着检测非线性关系并不是很好。

  • 在上面的图中,Pearson’s r 并没有显示研究对象的相关性。

  • 然而,这些变量之间的关系很显然是非随机的。幸运的是,我们有不同的相关性方法。

距离相关性

  • 距离相关性与 Pearson’s r 有一些相似之处,但是实际上是用一个相当不同的协方差概念来计算的。该方法通过用「距离」类似物替代常用的协方差和标准差(如上所定义)的概念。

  • 类似 Pearson’s r,「距离相关性」被定义为「距离协方差」,由「距离标准差」来归一化。

  • 距离相关性不是根据它们与各自平均值的距离来估计两个变量如何共同变化,而是根据与其他点的距离来估计它们是如何共同变化的,从而能更好捕捉变量之间非线性依赖关系。

深入细节

  • 出生于 1773 年的 Robert Brown 是一名苏格兰植物学家。当布朗在显微镜下研究植物花粉时,注意到液面上有随机运动的有机颗粒。

  • 他没有想到,这一观察竟使他名垂千古——他成为了布朗运动的(重新)发现者。

  • 他更不会知道,近一个世纪的时间后爱因斯坦才对这种现象做出了解释,从而证实了原子的存在。同年,爱因斯坦发表了关于狭义相对论的论文(E=MC²),并打开了量子理论的大门。

  • 布朗运动是这样一个物理过程:由于与周围粒子的碰撞,微小粒子随机运动。

  • 布朗运动背后的数学原理可以被推广为维纳过程(Weiner process),维纳过程在数学金融中最著名的模型 Black-Scholes 中也扮演着重要的角色。

  • 有趣的是,Gabor Szekely 在 20 世纪中期的研究表明,布朗运动和维纳过程和一个非线性关联度量相关。

  • 让我们来看看如何由长度为 N 的向量 x 和 y 计算这个量。
  1. 首先,我们对每个向量构建 N×N 的距离矩阵。距离矩阵和地图中的道路距离表非常类似——每行、每列的交点显示了相应城市间的距离。在距离矩阵中,行 i 和列 j 的交点给出了向量的第 i 个元素和第 j 个元素之间的距离。

  2. 第二,矩阵是「双中心」的。也就是说,对于每个元素,我们减去了它的行平均值和列平均值。然后,我们再加上整个矩阵的总平均值。加「^」表示「双中心」,加「-」表示「平均值」。

  1. 在两个双中心矩阵的基础上,将 X 中每个元素的均值乘以 Y 中相应元素的均值,则可计算出距离协方差的平方。

  1. 现在,我们可以用类似的办法找到「距离方差」。请记住,若两个向量相同,其协方差与其方差相等。因此,距离方差可表示如下:

  1. 最后,我们利用上述公式计算距离相关性。请记住,(距离)标准差与(距离)方差的平方根相等。

物理解释

  • 关于距离相关性的表述,有着一个更令人惊讶的结果——它与布朗关联(Brownian correlation)有着确切的等价关系。布朗关联指的是两个布朗过程之间的独立性(或依赖性)。相互依赖的布朗过程将会表现出彼此「跟随」的趋势。让我们用一个简单的比喻来把握距离相关性的概念——请看下图中漂浮在湖面上的小纸船。如果没有盛行风向,那么每艘船都将进行随机漂流——这与布朗运动类似。

  • 无盛行风向时,小船随机漂流

  • 如果存在盛行风向,那么小船漂流的方向将依赖于风的强度。风力越强,依赖性越显著。

  • 有盛行风向时,小船倾向于同向漂流

  • 与之类似,无关变量可以被看作无盛行风向时随机漂流的小船;相关变量可以被看作在盛行风向影响下漂流的小船。在这个比喻中,风的强弱就代表着两个变量之间相关性的强弱。

  • 如果我们允许盛行风向在湖面的不同位置有所不同,那么我们就可以引入非线性的概念。距离相关性利用「小船」之间的距离推断盛行风的强度。

最大信息系数

  • 最大信息系数(MIC)于 2011 年提出,它是用于检测变量之间非线性相关性的最新方法。用于进行 MIC 计算的算法将信息论和概率的概念应用于连续型数据。

深入细节

  • 由克劳德·香农于 20 世纪中叶开创的信息论是数学中一个引人注目的领域。

  • 信息论中的一个关键概念是熵——这是一个衡量给定概率分布的不确定性的度量。概率分布描述了与特定事件相关的一系列给定结果的概率。

  • 概率分布的熵是「每个可能结果的概率乘以其对数后的和」的负值

  • 为了理解其工作原理,让我们比较下面两个概率分布:

X 轴标明了可能的结果;Y 轴标明了它们各自的概率

  • 常规骰子的熵更高。这是因为每种结果的可能性都一样,所以我们不会提前知道结果偏向哪个。但是,非常规的骰子有所不同——某些结果的发生概率远大于其它结果——所以它的结果的不确定性也低一些。

  • 这么一来,我们就能明白,当每种结果的发生概率相同时,它的熵最高。而这种概率分布也就是传说中的「均匀」分布。

  • 交叉熵是熵的一个拓展概念,它引入了第二个变量的概率分布。

  • 两个相同概率分布之间的交叉熵等于其各自单独的熵。但是对于两个不同的概率分布,它们的交叉熵可能跟各自单独的熵有所不同。

  • 这种差异,或者叫「散度」可以通过 KL 散度(Kullback-Leibler divergence)量化得出。

  • 两概率分布 X 与 Y 的 KL 散度如下:

  • 概率分布 X 与 Y 的 KL 散度等于它们的交叉熵减去 X 的熵

  • KL 散度的最小值为 0,仅当两个分布相同。

  • 为了发现变量具有相关性,KL 散度的用途之一是计算两个变量的互信息(MI)。

  • 互信息可以定义为「两个随机变量的联合分布和边缘分布之间的 KL 散度」。如果二者相同,MI 值取 0。如若不同,MI 值就为一个正数。二者之间的差异越大,MI 值就越大。

  • 为了加深理解,我们首先简单回顾一些概率论的知识。

  • 变量 X 和 Y 的联合概率就是二者同时发生的概率。例如,如果你抛掷两枚硬币 X 和 Y,它们的联合分布将反映抛掷结果的概率。假设你抛掷硬币 100 次,得到「正面、正面」的结果 40 次。联合分布将反映如下:

  • P(X=H, Y=H) = 40/100 = 0.4

  • 边缘分布是指不考虑其它变量而只关注某一特定变量的概率分布。假设两变量独立,二者边缘概率的乘积即为二者同时发生的概率。仍以抛硬币为例,假如抛掷结果是 50 次正面和 50 次反面,它们的边缘分布如下:

  • P(X=H) = 50/100 = 0.5 ; P(Y=H) = 50/100 = 0.5

  • P(X=H) × P(Y=H) = 0.5 × 0.5 = 0.25

  • 现在让我们回到抛硬币的例子。如果两枚硬币相互独立,边缘分布的乘积表示每个结果可能发生的概率,而联合分布则为实际得到的结果的概率。

  • 如果两硬币完全独立,它们的联合概率在数值上(约)等于边缘分布的乘积。若只是部分独立,此处就存在散度。

  • 这个例子中,P(X=H,Y=H) > P(X=H) × P(Y=H)。这表明两硬币全为正面的概率要大于它们的边缘分布之积。

  • 联合分布和边缘分布乘积之间的散度越大,两个变量之间相关的可能性就越大。两个变量的互信息定义了散度的度量方式。

  • X 和 Y 的互信息等于「二者边缘分布积和的联合分布的 KL 散度」

  • 此处的一个重要假设就是概率分布是离散的。那么我们如何把这些概念应用到连续的概率分布呢?

分箱算法

  • 其中一种方法是量化数据(使变量离散化)。这是通过分箱算法(bining)实现的,它能将连续的数据点分配对应的离散类别。

  • 此方法的关键问题是到底要使用多少「箱子(bin)」。幸运的是,首次提出 MIC 的论文给出了建议:穷举!

  • 也就是说,去尝试不同的「箱子」个数并观测哪个会在变量间取到最大的互信息值。不过,这提出了两个挑战:

  • 要试多少个箱子呢?理论上你可以将变量量化到任意间距值,可以使箱子尺寸越来越小。

  • 互信息对所用的箱子数很敏感。你如何公平比较不同箱子数目之间的 MI 值?

  • 第一个挑战从理论上讲是不能做到的。但是,论文作者提供了一个启发式解法(也就是说,解法不完美,但是十分接近完美解法)。他们也给出了可试箱子个数的上限。

  • 最大可用箱子个数由样本数 N 决定

  • 至于如何公平比较取不同箱子数对 MI 值的影响,有一个简单的做法……就是归一化!这可以通过将每个 MI 值除以在特定箱子数组合上取得的理论最大值来完成。我们要采用的是产生最大归一化 MI 总值的箱子数组合。

  • 互信息可以通过除以最小的箱子数的对数来归一化

  • 最大的归一化互信息就是 X 和 Y 的最大信息系数(MIC)。我们来看看一些估算两个连续变量的 MIC 的代码。

  • 以上代码是对原论文中方法的简化。更接近原作的算法实现可以参考 R package minerva(https://cran.r-project.org/web/packages/minerva/index.html)。

  • 在 Python 中的实现请参考 minepy module(https://minepy.readthedocs.io/en/latest/)。

  • MIC 能够表示各种线性和非线性的关系,并已得到广泛应用。它的值域在 0 和 1 之间,值越高表示相关性越强。

实验测试

噪声函数

  • Pearson’s r = - 0.05
  • 距离相关性 = 0.157
  • MIC = 0.097

简单线性函数

  • Pearson’s r =+0.95
  • 距离相关性 = 0.95
  • MIC = 0.89

简单二次函数

  • Pearson’s r =+0.003
  • 距离相关性 = 0.474
  • MIC = 0.594

三次函数

  • Pearson’s r =- 0.035
  • 距离相关性 = 0.382
  • MIC = 0.484

圆函数

  • Pearson’s r < 0.001
  • 距离相关性 = 0.234
  • MIC = 0.218

从PCC到MIC,理解变量之间的相关性相关推荐

  1. 最大信息系数——检测变量之间非线性相关性

    https://blog.csdn.net/qtlyx/article/details/50780400 最后的效果就是这样的.很明显可以看到,左下角那个有点像三角函数的关系,Pearson系数(就是 ...

  2. 变量之间的相关性研究

    目录 1 什么是相关性? 协方差及协方差矩阵 相关系数 (1)简单相关分析 (2)偏相关分析 (3)复相关分析 (4)典型相关分析 2 对已有数据的预分析 2.1 绘制变量相关的热力图 2.2 对热力 ...

  3. 变量之间的相关性:协方差、相关系数

    协方差 方差和标准差衡量的是一个变量(一组数据)的离散程度,也就是变量和均值之间的偏离程度. 协方差衡量的是两个变量之间的相关性,如: 正相关:两个变量具有相同的变化趋势(也称同方向),要么同时变大, ...

  4. 用pwcorr命令求变量之间的相关性如何加不同的星号?

    用pwcorr命令求变量之间的相关性如何加不同的星号? pwcorr命令中的star只能加一个星号,在连玉君老师的https://gitee.com/arlionn/pwcorr_a博客连接中下载pw ...

  5. NLP之【点互信息PMI】——衡量两变量之间的相关性

    点互信息PMI--衡量两变量之间的相关性 绪论 一.PMI的基本概念 二.调用Python nltk来计算两个词的PMI 三.根据词语的共现频次表自定义PMI函数计算 附录:nltk.download ...

  6. 两变量之间的相关性分析

    目录 0. 基本概念 1. 卡方检测 2. Eta系数 3. Pearson系数 (1) 适用条件 (2) 系数公式 (3) t检验 4. Spearman等级相关系数 (1) 适用情况 (2) 计算 ...

  7. python有哪些软件包用来考察变量之间的相关性_Python计算数据相关系数(person、Kendall、spearman)...

    pandas中DataFrame对象corr()方法的用法,该方法用来计算DataFrame对象中所有列之间的相关系数(包括pearson相关系数.Kendall Tau相关系数和spearman秩相 ...

  8. 如何确定变量之间的相关性,是否是线性,是否正相关

    根据相关系数,y与x1-x9的关系都非常密切(r > 0.8,ρ < 0.001),财政收入与城乡居民储蓄存款年底余额之间关系最为密切(r = 0.995,ρ < 0.001) 相关 ...

  9. 如何用python进行相关性分析_如何在python中检查连续变量和分类变量之间的相关性?...

    将分类变量转换为虚拟变量,并将变量放在numpy.array中.例如: data.csv:age,size,color_head 4,50,black 9,100,blonde 12,120,brow ...

  10. python分类变量相关性分析_如何在python中检查连续变量和分类变量之间的相关性?...

    将分类变量转换为伪变量here,并将变量放入numpy.array中.例如: data.csv:age,size,color_head 4,50,black 9,100,blonde 12,120,b ...

最新文章

  1. 职业梦想是计算机的英语作文,我的梦想职业英语作文
  2. Xamarin XAML语言教程基本页面ContentPage占用面积
  3. linux inotify-tools 监控文件变化
  4. goland 调试运行路径
  5. php面试常问的问题
  6. 计算机常用的数制及编码
  7. uCOS:时钟节拍代码追踪
  8. C# PagedList 真分页
  9. LeetCode MySQL 1873. 计算特殊奖金(case when then else end)
  10. 论文浅尝 | 基于Universal Schema与Memory Network的知识+文本问答
  11. git 分支管理策略 与 物理实现 --author by阮一峰 小鱼
  12. ART虚拟机 _ Java对象和类的内存结构,java中级面试题库weixin
  13. edgesForExtendedLayout ios7新特性
  14. 四年级上册数学计算机笔记,读书笔记:最新人教版四年级上册数学总复习讲义...
  15. CFDA发布GMP《计算机化系统和确认与验证》两个附录
  16. java.lang.IllegalArgumentException: Can not set xx field xx to jav问题解决
  17. MySQL日志与备份
  18. 顺序主子式的英文翻译(定义)
  19. Cathy Zhang automation test
  20. Composer安装ThinkPHP5

热门文章

  1. OneDrive彻底卸载
  2. ZohoCRM客户管理系统应用的案例分享
  3. 美国2012年总统候选人政治献金数据分析
  4. Aspose.word基础
  5. C/C++黑魔法-另类switch
  6. php定时发送qq消息,无需任何工具发送定时QQ消息
  7. ZR1012 Zbox loves keyboard (dp)
  8. zbox mysql_centos6.5搭建禅道
  9. 抽奖助手自动参与抽奖
  10. linux医疗工作站,门诊医生工作站的详细设计