service phone

400-123-4657

行业资讯

service phone 400-123-4657

656彩票-一文教你如何盘算变量之间的相关性

点击量:548    时间:2023-10-21

本文摘要:本文先容了几个重要的变量相关性的怀抱,包罗皮尔逊相关系数、距离相关性和最大信息系数等,并用简朴的代码和示例数据展示了这些怀抱的适用性对比。

本文先容了几个重要的变量相关性的怀抱,包罗皮尔逊相关系数、距离相关性和最大信息系数等,并用简朴的代码和示例数据展示了这些怀抱的适用性对比。从信号的角度来看,这个世界是一个嘈杂的地方。为了弄清楚所有的事情,我们必须有选择地把注意力集中到有用的信息上。通过数百万年的自然选择历程,我们人类已经变得很是擅长过滤配景信号。

我们学会将特定的信号与特定的事件联系起来。例如,假设你正在忙碌的办公室中打乒乓球。

为了回手对手的击球,你需要举行大量庞大的盘算和判断,将多个相互竞争的感官信号思量进去。为了预测球的运动,你的大脑必须重复采样球的位置并预计它未来的轨迹。更厉害的球员还会将对手击球时施加的旋转思量进去。

最后,为了击球,你需要思量对手的位置、自己的位置、球的速度,以及你计划施加的旋转。所有这些都涉及到了大量的潜意识微分学。

一般来说,我们天经地义的认为,我们的神经系统可以自动做到这些(至少经由一些训练之后)。同样令人印象深刻的是,人类大脑是如何区别看待它所吸收到的无数竞争信号的重要性的。例如,球的位置被认为比你身后发生的对话或你眼前打开的门更重要。

这听起来似乎不值得一提,但实际上这证明晰可以多大水平上学习从噪声数据中做出准确预测。固然,一个被给予一连的视听数据流的空缺状态机将碰面临一个难题的任务,即确定哪些信号能够最好地预测最佳行动方案。幸运的是,有统计和盘算方法可以用来识别带噪声和庞大的数据中的模式。

相关性一般来说,当我们谈到两个变量之间的「相关性(correlation)」时,在某种意义上,我们是指它们的「关系(relatedness)」。相关变量是包罗相互信息的变量。两个变量的相关性越强,其中一个变量告诉我们的关于另一个变量的信息就越多。

你可能之前就看过:正相关、零相关、负相关你可能已经对相关性、它的作用和它的局限性有了一定相识。事实上,这是一个数据科学的老生常谈:「相关性不意味着因果关系」这固然是正确的——有充实的理由说明,纵然是两个变量之间有强相关性也不保证存在因果关系。视察到的相关性可能是由于隐藏的第三个变量的影响,或者完全是偶然的。

也就是说,相关性确实允许基于另一个变量来预测一个变量。有几种方法可以用来预计线性和非线性数据的相关性。我们来看看它们是如何事情的。我们将用 Python 和 R 来举行数学和代码实现。

本文示例的代码可以在这里找到:GitHub 地址:https://gist.github.com/anonymous/fabecccf33f9c3feb568384f626a2c07皮尔逊相关系数皮尔逊相关系数(PCC, 或者 Pearson's r)是一种广泛使用的线性相关性的怀抱,它通常是许多低级统计课程的第一课。从数学角度讲,它被界说为「两个向量之间的协方差,通过它们尺度差的乘积来归一化」。两个成对的向量之间的协方差是它们在均值上下颠簸趋势的一种怀抱。也就是说,权衡一对向量是否倾向于在各自平均值的同侧或相反。

让我们看看在 Python 中的实现: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看起来变量之间有很强的关系,对吧?那为什么协方差这么小呢(约莫是 0.00003)?这里的关键是要认识到协方差是依赖于比例的。看一下 x 和 y 坐标轴——险些所有的数据点都落在了 0.015 和 0.04 之间。

协方差也将靠近于零,因为它是通过从每个个体视察值中减去平均值来盘算的。为了获得更有意义的数字,归一化协方差是很是重要的。方法是将其除以两个向量尺度差的乘积。在希腊字母中 ρ 常用来表现皮尔逊相关系数在 Python 中:import mathdef stDev(x): variance = 0 for 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 之间。箭头指向哪个偏向?顺便说一下,一个界说两个向量的 PCC 的更酷的方法来自线性代数。

首先,我们通过从向量各自的值中减去其均值的方法来「集中」向量。a = [1,2,3,4,5] ; b = [5,4,3,2,1]a_centered = [i - mean(a) for i in a]b_centered = [j - mean(b) for j in b]现在,我们可以使用向量可以看做指向特定偏向的「箭头」的事实。

例如,在 2-D 空间中,向量 [1,3] 可以代表一个沿 x 轴 1 个单元,沿 y 轴 3 个单元的箭头。同样,向量 [2,1] 可以代表一个沿 x 轴 2 个单元,沿 y 轴 1 个单元的箭头。两个向量 (1,3) 和 (2,1) 如箭头所示。

类似地,我们可以将数据向量表现为 n 维空间中的箭头(只管当 n > 3 时不能实验可视化)。这些箭头之间的角度 ϴ 可以使用两个向量的点积来盘算。

界说为:或者,在 Python 中:def dotProduct(x,y): calc = 0 for i in range(len(x)): calc += x[i] * y[i] return calc点积也可以被界说为:其中 || x || 是向量 x 的巨细(或「长度」)(参考勾股定理),ϴ 是箭头向量之间的角度。正如一个 Python 函数:def magnitude(x): x_sq = [i ** 2 for i in x] return math.sqrt(sum(x_sq))我们通过将点积除以两个向量巨细的乘积的方法获得 cos(ϴ)。def cosTheta(x,y): mag_x = magnitude(x) mag_y = magnitude(y) return dotProduct(x,y) / (mag_x * mag_y)现在,如果你对三角学有一定相识,你可能会记得,余弦函数发生一个在 +1 和 -1 之间震荡的图形。

cos(ϴ) 的值将凭据两个箭头向量之间的角度而发生变化。当角度为零时(即两个向量指向完全相同的偏向),cos(ϴ) 即是 1。当角度为 -180°时(两个向量指向完全相反的偏向),cos(ϴ) 即是 -1。

当角度为 90°时(两个向量指向完全不相关的偏向),cos(ϴ) 即是 0。这可能看起来很熟悉——一个介于 +1 和 -1 之间的权衡尺度似乎形貌了两个向量之间的关系?那不是 Pearson’s r 吗?那么——这正是它的解释!通过将数据视为高维空间中的箭头向量,我们可以用它们之间的角度 ϴ 作为相似度的权衡。

A) 正相关向量;B) 负相关向量;C) 不相关向量该角度 ϴ 的余弦在数学上与皮尔逊相关系数相等。当被视为高维箭头时,正相关向量将指向一个相似的偏向。

负相关向量将指向相反的偏向。而不相关向量将指向直角。就我小我私家而言,我认为这是一个明白相关性的很是直观的方法。

统计显著性?正如频率统计一样,重要的是询问从给定样本盘算的磨练统计量实际上有多重要。Pearson's r 也不破例。不幸的是,PCC 预计的置信区间不是完全直接的。

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

幸运的是,有一个解决方案——用一个被称为 Fisher 的 Z 变换的技巧:像平常一样盘算 Pearson's r 的预计值。用 Fisher 的 Z 变换将 r→z,用公式 z = arctanh(r) 完成。现在盘算 z 的尺度差。

幸运的是,这很容易盘算,由 SDz = 1/sqrt(n-3) 给出,其中 n 是样本巨细。选择显著性阈值,alpha,并检查与此对应的平均值有几多尺度差。

如果取 alpha = 0.95,用 1.96。通过盘算 z +(1.96 × SDz) 找到上限,通过盘算 z - (1.96 × SDz) 找到下限。用 r = tanh(z) 将这些转换回 r。

如果上限和下限都在零的同一侧,则有统计显著性!这里是在 Python 中的实现:r = Pearsons(x,y)z = math.atanh(r)SD_z = 1 / math.sqrt(len(x) - 3)z_upper = z + 1.96 * SD_zz_lower = z - 1.96 * SD_zr_upper = math.tanh(z_upper)r_lower = math.tanh(z_lower)固然,当给定一个包罗许多潜在相关变量的大数据集时,检查每对的相关性可能很吸引人。这通常被称为「数据疏浚」——在数据集中查找变量之间的任何显着关系。

如果确实接纳这种多重比力方法,则应该用适当的更严格的显著性阈值来降低发现错误相关性的风险(即找到纯粹偶然相关的无关变量)。一种方法是使用 Bonferroni correction。

小结到现在为止还好。我们已经看到 Pearson's r 如何用来盘算两个变量之间的相关系数,以及如何评估效果的统计显著性。给定一组未知的数据,用于开始挖掘变量之间的重要关系是很有可能的。

可是,有一个重要的陷阱——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. 第二,矩阵是「双中心」的。也就是说,对于每个元素,我们减去了它的行平均值和列平均值。然后,我们再加上整个矩阵的总平均值。上述公式中,加「^」表现「双中心」,加「-」表现「平均值」。

3. 在两个双中心矩阵的基础上,将 X 中每个元素的均值乘以 Y 中相应元素的均值,则可盘算出距离协方差的平方。4. 现在,我们可以用类似的措施找到「距离方差」。请记着,若两个向量相同,其协方差与其方差相等。

因此,距离方差可表现如下:5. 最后,我们使用上述公式盘算距离相关性。请记着,(距离)尺度差与(距离)方差的平方根相等。

如果你更喜欢代码实现而非数学符号,那么请看下面的 R 语言实现:set.seed(1234)doubleCenter <- function(x){ centered <- x for(i in 1:dim(x)[1]){ for(j in 1:dim(x)[2]){ centered[i,j] <- x[i,j] - mean(x[i,]) - mean(x[,j]) + mean(x) } } return(centered)}distanceCovariance <- function(x,y){ N <- length(x) distX <- as.matrix(dist(x)) distY <- as.matrix(dist(y)) centeredX <- doubleCenter(distX) centeredY <- doubleCenter(distY) calc <- sum(centeredX * centeredY) return(sqrt(calc/(N^2)))}distanceVariance <- function(x){ return(distanceCovariance(x,x))}distanceCorrelation <- function(x,y){ cov <- distanceCovariance(x,y) sd <- sqrt(distanceVariance(x)*distanceVariance(y)) return(cov/sd)}# Compare with Pearson's rx <- -10:10y <- x^2 + rnorm(21,0,10)cor(x,y) # --> 0.057distanceCorrelation(x,y) # --> 0.509任意两变量的距离相关性都在 0 和 1 之间。其中,0 代表两变量相互独立,而靠近于 1 则讲明变量间存在依赖关系。如果你不想重新开始编写距离相关方法,你可以安装 R 语言的 energy 包(https://cran.r-project.org/web/packages/energy/index.html),设计此方案的研究者提供了本代码。

在该法式包中,各种可用方案挪用的是 C 语言编写的函数,因此有着很大的速度优势。物明白释关于距离相关性的表述,有着一个更令人惊讶的效果——它与布朗关联(Brownian correlation)有着确切的等价关系。布朗关联指的是两个布朗历程之间的独立性(或依赖性)。

相互依赖的布朗历程将会体现出相互「追随」的趋势。让我们用一个简朴的比喻来掌握距离相关性的观点——请看下图中漂浮在湖面上的小纸船。如果没有盛行风向,那么每艘船都将举行随机漂流——这与布朗运动类似。无盛行风向时,小船随机漂流如果存在盛行风向,那么小船漂流的偏向将依赖于风的强度。

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

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

置信区间?我们可以接纳「重采样(resampling)」方法为距离相关性预计建设置信区间。一个简朴的例子是 bootstrap 重采样。这是一个巧妙的统计技巧,需要我们从原始数据集中随机抽样(替换)以「重建」数据。

这个历程将重复多次(例如 1000 次),每次都盘算感兴趣的统计量。这将为我们感兴趣的统计量发生一系列差别的预计值。

我们可以通过它们预计在给定置信水平下的上限和下限。请看下面的 R 语言代码,它实现了简朴的 bootstrap 函数:set.seed(1234)bootstrap <- function(x,y,reps,alpha){ estimates <- c() original <- data.frame(x,y) N <- dim(original)[1] for(i in 1:reps){ S <- original[sample(1:N, N, replace = TRUE),] estimates <- append(estimates, distanceCorrelation(S$x, S$y)) } u <- alpha/2 ; l <- 1-u interval <- quantile(estimates, c(l, u)) return(2*(dcor(x,y)) - as.numeric(interval[1:2]))}# Use with 1000 reps and threshold alpha = 0.05x <- -10:10y <- x^2 + rnorm(21,0,10)bootstrap(x,y,1000,0.05) # --> 0.237 to 0.546如果你想建设统计显著性,另有另一个重采样技巧,名为「排列磨练(permutation test)」。

排列磨练与上述 bootstrap 方法略有差别。在排列磨练中,我们保持一个向量稳定,并通过重采样对另一个变量举行「洗牌」。这靠近于零假设(null hypothesis)——即,在变量之间不存在依赖关系。

这个经「洗牌」打乱的变量将被用于盘算它和常变量间的距离相关性。这个历程将被执行多次,然后,效果的漫衍将与实际距离相关性(从未被「洗牌」的数据中获得)相比力。然后,大于或即是「实际」效果的经「洗牌」的效果的比例将被定为 P 值,并与给定的显著性阈值(如 0.05)举行比力。

以下是上述历程的代码实现:permutationTest <- function(x,y,reps){ estimates <- c() observed <- distanceCorrelation(x,y) N <- length(x) for(i in 1:reps){ y_i <- sample(y, length(y), replace = T) estimates <- append(estimates, distanceCorrelation(x, y_i)) } p_value <- mean(estimates >= observed) return(p_value)}# Use with 1000 repsx <- -10:10y <- x^2 + rnorm(21,0,10)permutationTest(x,y,1000) # --> 0.036最大信息系数最大信息系数(MIC)于 2011 年提出,它是用于检测变量之间非线性相关性的最新方法。用于举行 MIC 盘算的算法将信息论和概率的观点应用于一连型数据。深入细节由克劳德·香农于 20 世纪中叶开创的信息论是数学中一个引人注目的领域。

信息论中的一个关键观点是熵——这是一个权衡给定概率漫衍的不确定性的怀抱。概率漫衍形貌了与特定事件相关的一系列给定效果的概率。概率漫衍的熵是「每个可能效果的概率乘以其对数后的和」的负值为了明白其事情原理,让我们比力下面两个概率漫衍:X 轴标明晰可能的效果;Y 轴标明晰它们各自的概率左侧是一个通例六面骰子效果的概率漫衍;而右边的六面骰子不那么匀称。从直觉上来说,你认为哪个的熵更高呢?哪个骰子效果的不确定性更大?让我们来盘算它们的熵,看看谜底是什么。

entropy <- function(x){ pr <- prop.table(table(x)) H <- sum(pr * log(pr,2)) return(-H)}dice1 <- 1:6dice2 <- c(1,1,1,1,2:6)entropy(dice1) # --> 2.585entropy(dice2) # --> 2.281不出所料,通例骰子的熵更高。这是因为每种效果的可能性都一样,所以我们不会提前知道效果偏向哪个。可是,很是规的骰子有所差别——某些效果的发生概率远大于其它效果——所以它的效果的不确定性也低一些。

这么一来,我们就能明确,当每种效果的发生概率相同时,它的熵最高。而这种概率漫衍也就是传说中的「匀称」漫衍。交织熵是熵的一个拓展观点,它引入了第二个变量的概率漫衍。

crossEntropy <- function(x,y){ prX <- prop.table(table(x)) prY <- prop.table(table(y)) H <- sum(prX * log(prY,2)) return(-H)}两个相同概率漫衍之间的交织熵即是其各自单独的熵。可是对于两个差别的概率漫衍,它们的交织熵可能跟各自单独的熵有所差别。

这种差异,或者叫「散度」可以通过 KL 散度(Kullback-Leibler divergence)量化得出。两概率漫衍 X 与 Y 的 KL 散度如下:概率漫衍 X 与 Y 的 KL 散度即是它们的交织熵减去 X 的熵KL 散度的最小值为 0,仅当两个漫衍相同。KL_divergence <- function(x,y){ kl <- crossEntropy(x,y) - entropy(x) return(kl)}为了发现变量具有相关性,KL 散度的用途之一是盘算两个变量的互信息(MI)。互信息可以界说为「两个随机变量的团结漫衍和边缘漫衍之间的 KL 散度」。

如果二者相同,MI 值取 0。如若差别,MI 值就为一个正数。二者之间的差异越大,MI 值就越大。

为了加深明白,我们首先简朴回首一些概率论的知识。变量 X 和 Y 的团结概率就是二者同时发生的概率。例如,如果你投掷两枚硬币 X 和 Y,它们的团结漫衍将反映投掷效果的概率。假设你投掷硬币 100 次,获得「正面、正面」的效果 40 次。

团结漫衍将反映如下:P(X=H, Y=H) = 40/100 = 0.4jointDist <- function(x,y){ N <- length(x) u <- unique(append(x,y)) joint <- c() for(i in u){ for(j in u){ f <- x[paste0(x,y) == paste0(i,j)] joint <- append(joint, length(f)/N) } } return(joint)}边缘漫衍是指不思量其它变量而只关注某一特定变量的概率漫衍。假设两变量独立,二者边缘概率的乘积即为二者同时发生的概率。

仍以抛硬币为例,如果投掷效果是 50 次正面和 50 次反面,它们的边缘漫衍如下:P(X=H) = 50/100 = 0.5 ; P(Y=H) = 50/100 = 0.5P(X=H) × P(Y=H) = 0.5 × 0.5 = 0.25marginalProduct <- function(x,y){ N <- length(x) u <- unique(append(x,y)) marginal <- c() for(i in u){ for(j in u){ fX <- length(x[x == i]) / N fY <- length(y[y == j]) / N marginal <- append(marginal, fX * fY) } } return(marginal)}现在让我们回到抛硬币的例子。如果两枚硬币相互独立,边缘漫衍的乘积表现每个效果可能发生的概率,而团结漫衍则为实际获得的效果的概率。

如果两硬币完全独立,它们的团结概率在数值上(约)即是边缘漫衍的乘积。若只是部门独立,此处就存在散度。这个例子中,P(X=H,Y=H) > P(X=H) × P(Y=H)。这讲明两硬币全为正面的概率要大于它们的边缘漫衍之积。

团结漫衍和边缘漫衍乘积之间的散度越大,两个变量之间相关的可能性就越大。两个变量的互信息界说了散度的怀抱方式。

X 和 Y 的互信息即是「二者边缘漫衍积和的团结漫衍的 KL 散度」mutualInfo <- function(x,y){ joint <- jointDist(x,y) marginal <- marginalProduct(x,y) Hjm <- - sum(joint[marginal > 0] * log(marginal[marginal > 0],2)) Hj <- - sum(joint[joint > 0] * log(joint[joint > 0],2)) return(Hjm - Hj)}此处的一个重要假设就是概率漫衍是离散的。那么我们如何把这些观点应用到一连的概率漫衍呢?分箱算法其中一种方法是量化数据(使变量离散化)。

这是通太过箱算法(bining)实现的,它能将一连的数据点分配对应的离散种别。此方法的关键问题是到底要使用几多「箱子(bin)」。幸运的是,首次提出 MIC 的论文给出了建议:穷举!也就是说,去实验差别的「箱子」个数并观察哪个会在变量间取到最大的互信息值。不外,这提出了两个挑战:要试几多个箱子呢?理论上你可以将变量量化到任意间距值,可以使箱子尺寸越来越小。

互信息对所用的箱子数很敏感。你如何公正比力差别箱子数目之间的 MI 值?第一个挑战从理论上讲是不能做到的。可是,论文作者提供了一个启发式解法(也就是说,解法不完美,可是十分靠近完美解法)。

他们也给出了可试箱子个数的上限。最大可用箱子个数由样本数 N 决议至于如何公正比力取差别箱子数对 MI 值的影响,有一个简朴的做法……就是归一化!这可以通过将每个 MI 值除以在特定箱子数组合上取得的理论最大值来完成。

我们要接纳的是发生最大归一化 MI 总值的箱子数组合。互信息可以通过除以最小的箱子数的对数来归一化最大的归一化互信息就是 X 和 Y 的最大信息系数(MIC)。我们来看看一些估算两个一连变量的 MIC 的代码。MIC <- function(x,y){ N <- length(x) maxBins <- ceiling(N ** 0.6) MI <- c() for(i in 2:maxBins) { for (j in 2:maxBins){ if(i * j > maxBins){ next } Xbins <- i; Ybins <- j binnedX <-cut(x, breaks=Xbins, labels = 1:Xbins) binnedY <-cut(y, breaks=Ybins, labels = 1:Ybins) MI_estimate <- mutualInfo(binnedX,binnedY) MI_normalized <- MI_estimate / log(min(Xbins,Ybins),2) MI <- append(MI, MI_normalized) }} return(max(MI))}x <- runif(100,-10,10)y <- x**2 + rnorm(100,0,10)MIC(x,y) # --> 0.751以上代码是对原论文中方法的简化。

更靠近原作的算法实现可以参考 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 之间,值越高表现相关性越强。置信区间?为了建设 MIC 预计值的置信区间,你可以简朴地使用一个像我们之前先容过的 bootstrap 函数。

我们可以使用 R 语言的函数式编程,通过通报我们想要用作参数的函数来泛化 bootstrap 函数。bootstrap <- function(x,y,func,reps,alpha){ estimates <- c() original <- data.frame(x,y) N <- dim(original)[1] for(i in 1:reps){ S <- original[sample(1:N, N, replace = TRUE),] estimates <- append(estimates, func(S$x, S$y)) } l <- alpha/2 ; u <- 1 - l interval <- quantile(estimates, c(u, l)) return(2*(func(x,y)) - as.numeric(interval[1:2]))}bootstrap(x,y,MIC,100,0.05) # --> 0.594 to 0.88总结为了总结相关性这一主题,我们来测试下各算法在人工生成数据上的处置惩罚能力。完整代码:https://gist.github.com/anonymous/fabecccf33f9c3feb568384f626a2c07噪声函数set.seed(123)# Noisex0 <- rnorm(100,0,1)y0 <- rnorm(100,0,1)plot(y0~x0, pch = 18)cor(x0,y0)distanceCorrelation(x0,y0)MIC(x0,y0)Pearson's r = - 0.05距离相关性 = 0.157MIC = 0.097简朴线性函数# Simple linear relationshipx1 <- -20:20y1 <- x1 + rnorm(41,0,4)plot(y1~x1, pch =18)cor(x1,y1)distanceCorrelation(x1,y1)MIC(x1,y1)Pearson's r =+0.95距离相关性 = 0.95MIC = 0.89简朴二次函数# y ~ x**2x2 <- -20:20y2 <- x2**2 + rnorm(41,0,40)plot(y2~x2, pch = 18)cor(x2,y2)distanceCorrelation(x2,y2)MIC(x2,y2)Pearson's r =+0.003距离相关性 = 0.474MIC = 0.594三次函数# Cosinex3 <- -20:20y3 <- cos(x3/4) + rnorm(41,0,0.2)plot(y3~x3, type='p', pch=18)cor(x3,y3)distanceCorrelation(x3,y3)MIC(x3,y3)Pearson's r =- 0.035距离相关性 = 0.382MIC = 0.484圆函数# Circlen <- 50theta <- runif (n, 0, 2*pi)x4 <- append(cos(theta), cos(theta))y4 <- append(sin(theta), -sin(theta))plot(x4,y4, pch=18)cor(x4,y4)distanceCorrelation(x4,y4)MIC(x4,y4)Pearson's r < 0.001距离相关性 = 0.234MIC = 0.218。


本文关键词:656彩票

本文来源:656彩票-www.justinaspetuchovas.com

地址:安徽省马鞍山市当涂县平德大楼62号     座机:400-123-4657    手机:12714429274
版权所有:Copyright © 2007-2023 www.justinaspetuchovas.com. 656彩票科技 版权所有    ICP备案编号:ICP备19394015号-8