你是否曾看着你的数据,觉得少了些什么,或者它向你隐藏了什么?这是一份深入的指南,旨在揭示数据集中变量之间那些隐藏的联系和未知的关系。
为什么你应该关心?
像线性回归这样的机器学习算法讨厌意外。
发现并量化数据集中变量之间相互依赖的程度至关重要。这些知识可以帮助你更好地准备数据,以满足机器学习算法(如线性回归)的期望,因为这些相互依赖关系会降低算法的性能。
在本指南中,你将发现相关性是变量之间关系的统计摘要,以及如何为不同类型的变量和关系计算它。
完成本教程后,您将了解:
- 协方差矩阵的魔力:总结多个变量之间的线性联系。
- 皮尔逊的力量:解读两个变量之间的线性关系。
- 斯皮尔曼的洞察:揭示变量之间独特的单调节奏。
用我的新书《机器学习统计学》来启动你的项目,其中包括所有示例的分步教程和 Python 源代码文件。
让我们开始吧。
- 2018年5月更新:更新了协方差符号的描述(感谢 Fulya)。
- 2023年11月更新:为更清晰和提供更多见解,更新了一些措辞。

如何使用相关性来理解变量之间的关系
照片由 Fraser Mummery 拍摄,保留部分权利。
教程概述
本教程分为5个部分,它们是:
- 什么是相关性?
- 测试数据集
- 协方差
- 皮尔逊相关
- 斯皮尔曼相关
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
什么是相关性?
你有没有想过你的数据变量是如何相互关联的?数据集中的变量可能因多种原因而相关。
例如:
- 一个变量可能会导致或依赖于另一个变量的值。
- 一个变量可能与另一个变量有轻微的关联。
- 两个变量可能都依赖于第三个未知的变量。
相关性的所有这些方面,以及数据变量如何相互依赖或关联,都让我们思考它们的用途。相关性在数据分析和建模中非常有用,可以更好地理解变量之间的关系。两个变量之间的统计关系被称为它们的相关性。
相关性可以以不同方式呈现:
- 正相关:两个变量朝同一方向变化。
- 中性相关:变量的变化之间没有关系。
- 负相关:变量朝相反方向变化。
如果两个或多个变量紧密相关(称为多重共线性),某些算法的性能可能会下降。一个例子是线性回归,其中应该移除一个相关的冲突变量以提高模型的技能。
我们也可能对输入变量与输出变量之间的相关性感兴趣,以便了解哪些变量可能与开发模型相关或不相关。
关系的结构可能是已知的,例如,它可能是线性的,或者我们可能不知道两个变量之间是否存在关系,或者它可能采取什么结构。根据对关系和变量分布的了解程度,可以计算不同的相关性分数。
在本教程指南中,我们将深入探讨一种为具有高斯分布和线性关系的变量量身定制的相关性分数。我们还将探讨另一种不依赖于特定分布并能捕捉任何单调(递增或递减)关系的分数。
测试数据集
在我们深入探讨相关性方法之前,让我们先定义一个可以用来测试这些方法的数据集。
我们将生成1000个具有强正相关性的两个变量的样本。第一个变量将是从均值为100、标准差为20的高斯分布中抽取的随机数。第二个变量将是第一个变量的值加上均值为50、标准差为10的高斯噪声。
我们将使用 randn() 函数生成均值为0、标准差为1的随机高斯值,然后将结果乘以我们自己的标准差并加上均值,以将值移动到首选范围内。
伪随机数生成器被设定种子,以确保每次运行代码时我们都能得到相同的数字样本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 生成相关变量 from numpy import mean from numpy import std from numpy.random import randn from numpy.random import seed from matplotlib import pyplot # 设定随机数生成器种子 seed(1) # 准备数据 data1 = 20 * randn(1000) + 100 data2 = data1 + (10 * randn(1000) + 50) # 总结 print('data1: mean=%.3f stdv=%.3f' % (mean(data1), std(data1))) print('data2: mean=%.3f stdv=%.3f' % (mean(data2), std(data2))) # 绘图 pyplot.scatter(data1, data2) pyplot.show() |
执行上述代码最初会输出两个变量的均值和标准差
1 2 |
data1: mean=100.776 stdv=19.620 data2: mean=151.050 stdv=22.358 |
将会创建这两个变量的散点图。因为我们是人为构造了这个数据集,所以我们知道这两个变量之间存在关系。当我们回顾生成的散点图时,这一点很清楚,我们可以看到一个上升的趋势。

测试相关性数据集的散点图
在我们看计算一些相关性分数之前,首先必须理解一个基本的统计概念,即协方差。
协方差
你可能在学校和数据科学领域中经常听说过线性关系。许多统计分析的核心是变量之间的线性关系。这是一种在两个数据样本中始终保持加性关系的关系。
这种关系可以在两个变量之间进行总结,称为协方差。它的计算方法是每个样本的值之间乘积的平均值,其中值已经中心化(通过减去它们各自的均值)。
样本协方差的计算如下
1 |
cov(X, Y) = (sum (x - mean(X)) * (y - mean(Y)) ) * 1/(n-1) |
在计算中使用均值意味着每个数据应理想地遵循高斯分布或类高斯分布。
协方差的符号可以解释为两个变量是朝同一方向变化(正)还是朝不同方向变化(负)。协方差的大小不易解释。协方差值为零表示两个变量完全独立。
可以使用 NumPy 的 cov() 函数来计算两个或多个变量之间的协方差矩阵。
1 |
covariance = cov(data1, data2) |
矩阵的对角线包含每个变量与其自身的协方差。矩阵中的其他值表示两个变量之间的协方差;在这种情况下,剩下的两个值是相同的,因为我们只计算两个变量的协方差。
我们可以为我们的测试问题中的两个变量计算协方差矩阵。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 计算两个变量之间的协方差 from numpy.random import randn from numpy.random import seed from numpy import cov # 设定随机数生成器种子 seed(1) # 准备数据 data1 = 20 * randn(1000) + 100 data2 = data1 + (10 * randn(1000) + 50) # 计算协方差矩阵 covariance = cov(data1, data2) print(covariance) |
协方差和协方差矩阵在统计学和多元分析中被广泛用于描述两个或多个变量之间的关系。
运行该示例会计算并打印协方差矩阵。
由于数据集是人为构建的,每个变量都来自高斯分布,并且变量呈线性相关,因此协方差是描述这种关系的合理方法。
两个变量之间的协方差是389.75。我们可以看到它是正的,这表明变量朝着我们预期的相同方向变化。
1 2 |
[[385.33297729 389.7545618 ] [389.7545618 500.38006058]] |
仅将协方差作为一种统计工具存在一个问题,即它难以解释。这引导我们接下来讨论皮尔逊相关系数。
皮尔逊相关
以卡尔·皮尔逊(Karl Pearson)的名字命名,皮尔逊相关系数可用于总结两个数据样本之间线性关系的强度。
皮尔逊相关系数的计算方法是将两个变量的协方差除以它们各自标准差的乘积。它是对两个变量之间的协方差进行归一化,从而得到一个可解释的分数。
1 |
皮尔逊相关系数 = 协方差(X, Y) / (标准差(X) * 标准差(Y)) |
在计算中使用均值和标准差表明,两个数据样本需要具有高斯或类高斯分布。
计算的结果,即相关系数,可以用来理解这种关系。
该系数返回一个介于-1和1之间的值,象征着相关性的整个范围:从完全负相关到完全正相关。值为0表示没有相关性。该值必须进行解释,通常低于-0.5或高于0.5的值表示存在显著的相关性,而低于这些值的值则表示相关性不太显著。
可以使用 SciPy 的 pearsonr() 函数来计算两个长度相同的数据样本之间的皮尔逊相关系数。
我们可以计算我们测试问题中两个变量之间的相关性。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 计算两个变量之间的皮尔逊相关性 from numpy.random import randn from numpy.random import seed from scipy.stats import pearsonr # 设定随机数生成器种子 seed(1) # 准备数据 data1 = 20 * randn(1000) + 100 data2 = data1 + (10 * randn(1000) + 50) # 计算皮尔逊相关性 corr, _ = pearsonr(data1, data2) print('Pearsons correlation: %.3f' % corr) |
执行后,将确定并显示皮尔逊相关系数。两个变量之间0.888的显著正相关性很强,因为它超过了0.5的阈值并接近1.0。
1 |
皮尔逊相关性:0.888 |
皮尔逊相关系数可用于评估两个以上变量之间的关系。
这可以通过计算数据集中每对变量之间关系的一个矩阵来实现。结果是一个对称矩阵,称为相关矩阵,其对角线上的值为1.0,因为每一列总是与自身完全相关。
斯皮尔曼相关
虽然许多数据关系可以是线性的,但有些可能是非线性的。这些非线性关系在变量的分布中表现得更强或更弱。此外,所考虑的两个变量可能不服从高斯分布。
以查尔斯·斯皮尔曼(Charles Spearman)的名字命名,斯皮尔曼相关系数可用于总结两个数据样本之间的强度。如果变量之间存在线性关系,也可以使用这种关系检验,但其效力会稍低(例如,可能导致较低的系数值)。
与皮尔逊相关系数一样,分数介于-1和1之间,分别代表完全负相关和完全正相关的变量。
它不是直接处理数据样本,而是对数据值的相对排名进行操作。这是非参数统计中常用的一种方法,例如,在我们不假设数据分布(如高斯分布)的统计方法中。
1 |
斯皮尔曼相关系数 = 协方差(rank(X), rank(Y)) / (标准差(rank(X)) * 标准差(rank(Y))) |
不假设变量之间存在线性关系,但假设存在单调关系。这是两个变量之间递增或递减关系的数学名称。
如果你不确定两个变量的分布和可能的关系,斯皮尔曼相关系数是一个很好的工具。
可以使用 SciPy 的 spearmanr() 函数来计算两个长度相同的数据样本之间的斯皮尔曼相关系数。
我们可以计算我们测试问题中两个变量之间的相关性。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 计算两个变量之间的斯皮尔曼相关性 from numpy.random import randn from numpy.random import seed from scipy.stats import spearmanr # 设定随机数生成器种子 seed(1) # 准备数据 data1 = 20 * randn(1000) + 100 data2 = data1 + (10 * randn(1000) + 50) # 计算斯皮尔曼相关性 corr, _ = spearmanr(data1, data2) print('Spearmans correlation: %.3f' % corr) |
运行此示例将计算并打印斯皮尔曼相关系数。
我们知道数据是高斯分布的,并且变量之间的关系是线性的。尽管如此,基于秩的非参数方法显示出变量之间存在0.8的强相关性。
1 |
斯皮尔曼相关性:0.872 |
与皮尔逊相关系数一样,该系数可以为数据集中的每个变量成对计算,从而得出一个相关矩阵以供审查。
有关 Python 中非参数相关方法的更多帮助,请参阅
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 生成您自己的具有正负关系的数据集,并计算两种相关系数。
- 编写函数来为给定数据集计算皮尔逊或斯皮尔曼相关矩阵。
- 加载一个标准的机器学习数据集,并计算所有实值变量对之间的相关系数。
如果你探索了这些扩展中的任何一个,我很想知道。请在下面的评论中告诉我你的成功故事。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
文章
API
- numpy.random.seed() API
- numpy.random.randn() API
- numpy.mean() API
- numpy.std() API
- matplotlib.pyplot.scatter() API
- numpy.cov() API
- scipy.stats.pearsonr() API
- scipy.stats.spearmanr() API
文章
总结
在本教程中,您发现相关性是变量之间关系的统计摘要,以及如何为不同类型的变量和关系计算它。
具体来说,你学到了:
- 如何计算协方差矩阵以总结两个或多个变量之间的线性关系。
- 如何计算皮尔逊相关系数来总结两个变量之间的线性关系。
- 如何计算斯皮尔曼相关系数以总结两个变量之间的单调关系。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
你好,Jason!
非常感谢你的文章!
也许我错了。但我感觉协方差公式应该多一个左括号
cov(X, Y) = sum ((x – mean(X)) * (y – mean(Y)) * 1/(n-1)).
如果我说得不对,请纠正我。
已修正,谢谢。
你好 Jason,
对于像我这样的初学者来说,这是一篇关于相关性的非常好的文章。
我认为你在协方差函数中又漏掉了一个括号。
cov(X,Y) = sum((x-mean(X)) * (y-mean(Y))) * 1/(n-1)
谢谢。
嗨,Jason,再次感谢你这篇精彩的教程,这正是我过去几天一直在寻找的内容。我有一个问题,如果我们对输入变量和输出变量之间的相关性感兴趣,我们能简单地使用其中一种相关性指标,即期望的输入变量和输出变量来计算吗?还是在考虑输出时需要遵循不同的程序?
是的,这是寻找相关/不相关输入变量的一种有效方法。
不过,它忽略了多个输入和输出之间的交互作用,所以要始终进行实验,并以最终的模型性能来指导你。
你好,Jason。
我很好奇,您有首选的度量方法来衡量输入和二元目标值之间的“相关性”吗?
好问题。
对于两个分类变量,我们可以使用卡方检验。
通常,我会考虑使用特征选择方法。
请问如果我们想研究定性变量与定量变量之间的相关性,可以使用哪种方法?也就是说,如果我想观察定性变量随定量变量变化而发生的变化。
嗨,Bennani……请翻译成英文,以便我们更好地帮助您。
嗨,Jason!很棒的文章!我期待阅读您的统计学书籍。而且我喜欢博客末尾的API部分!干杯!
谢谢!
嗨,Jason!
哇,真的非常感谢你的文章。很棒的文章。
您有计划添加格兰杰因果分析吗?这也是一种衡量变量间相关性的方法。
祝你有美好的一天~
什么是“格兰杰因果分析”?
尊敬的Jason博士,
我希望报告在“测试数据集”、“协方差”、“皮尔逊相关性”和“斯皮尔曼相关性”下的两个拼写错误,
分别在第11和12行,第8和9行,第8和9行以及第8和9行中。
应该是
这是因为在前者下,如果使用'randn',你会得到一个错误。
此致
来自令人兴奋的Belfield的Anthony。
尊敬的Jason博士,
非常抱歉。教程在区分‘random’和‘randn’函数方面不够清晰。
区别在于
‘randn’ 生成从-1到1的标准正态分布。更多帮助请看
而‘random’是一个多功能函数,它允许你从各种分布中生成值,例如均匀分布和高斯分布(mu, sigma)等等。
很抱歉我忽略了导入'randn'的细微之处。同时我也学到了一些东西。
谢谢你,
来自令人兴奋的Belfield的Anthony
不客气。
教给你一些东西正是这个网站的目标!
在 Py3 和最新的 numpy 上它不会报错。
您使用的是哪个版本的Numpy/Python?
尊敬的Jason博士。
是我的错,我没有包含
那之后就没问题了。
版本是
结果好,一切都好,
来自Belfield市中心的Anthony
很高兴听到这个消息。
嗨,Jason,
感谢您的帖子。我的情况是,有很多候选输入变量,我想预测一个输出。我想从所有变量中选择一些相关的变量作为输入。那么我可以使用归一化互信息(NMI)方法来进行选择吗?
我建议测试一套特征选择方法
https://machinelearning.org.cn/an-introduction-to-feature-selection/
嗨,Jason,
我可以用皮尔逊相关性来处理两个时间序列,以找出它们之间的依赖关系吗?
如果不行,您能给一些资料或者您的另一篇博客文章来阅读吗?
祝好
好问题。
对于与先前时间步长的相关性,我们通常使用自相关图
https://machinelearning.org.cn/gentle-introduction-autocorrelation-partial-autocorrelation/
对于序列间的相关性,我们使用互相关
https://en.wikipedia.org/wiki/Cross-correlation
有没有一个使用这个简单数据集来分离两个高斯分布的例子,并用两种颜色为每个分布显示一个结果散点图?
我不太明白,你具体指的是什么?
嗨,Jason,
感谢这篇好文章。我有一个小建议。我的理解是,“relationship” 应该用于人与人之间(例如,“they have a close relationship”),而 “relation” 应该用于更抽象的概念(例如两个变量之间)。
更多详情,请参阅 http://www.learnersdictionary.com/qa/relations-and-relationship
祝好!
非常好,谢谢!
我正在处理一个kaggle数据集,我想检查两个特征之间的非线性相关性。
所以根据您的说法,斯皮尔曼相关性可以用于我的目的,对吗?
计算非线性关系还有哪些其他方法?
先谢谢您了。
是的。我在这里列出了更多
https://machinelearning.org.cn/statistical-hypothesis-tests-in-python-cheat-sheet/
据我所知,斯皮尔曼相关性需要两个特征之间存在单调相关性,这与线性关系类似(尽管限制较少)。
如果我错了,请纠正我。
谢谢
是的,是单调关系。
Jason,非常棒的文章!
我该如何确定几个变量之间的关系(目前依赖关系未知),以便得出一个将用作某个输出变量指标的度量?哪些参数与输出(随时间变化的工作负载)有相关性?这个度量与贝德福德工作负载量表指标相比如何?
也许可以从测量变量之间的简单线性相关性开始,并看结果是否显著。
请问有人能帮我提供变量间相关性的公式吗?
谢谢你
此致,
当然
https://en.wikipedia.org/wiki/Pearson_correlation_coefficient
好文章,点赞。我有个问题,不同变量之间的相关性会影响除线性回归之外的其他回归模型的性能吗?比如支持向量机或随机森林回归?
是的,它可能会影响其他模型。也许会影响SVM,但可能不会影响随机森林。
嗨,Jason,
你能帮我理解一下,在计算分类变量之间的系数时,我应该什么时候使用泰尔U系数 [https://en.m.wikipedia.org/wiki/Uncertainty_coefficient] 和皮尔逊/斯皮尔曼系数吗?
谢谢!
感谢您的建议,我将来可能会讨论这个主题
亲爱的 Jason,
谢谢你。你的文章总是很棒,读起来很好。对我来说,你博客最好的部分是问答环节,我非常钦佩你耐心回复所有提出的问题(希望也包括我的 :) )。
我的问题是,在我们的分类问题特征选择中,我们关注的是哪种特定类型的相关性?是正相关?中性相关?还是负相关?
希望我的问题对您有意义。
再次感谢您。
正或负线性相关是一个很好的开始。
谢谢Jason。很高兴知道你对此事的看法。
嗨 Jason,
对于一个二元分类任务,如果数据集是数值型的,除了目标变量外,所有变量都是连续值。我们能用 corr() 来确定变量间的关系吗?
在一些地方,应用 corr() 受到了质疑。
谢谢。
是的。
如果目标是二元的,我们能计算皮尔逊相关系数吗?我看到它在很多地方被使用。但它是如何工作的?
另外,计算分类特征与目标(二元或连续)之间的相关性有意义吗?
在Python中,要计算相关性,我们可以使用corr()或pearsonr()。有什么区别?
不,在这种情况下你可以使用卡方估计
https://machinelearning.org.cn/chi-squared-test-for-machine-learning/
嗨,Jason!很棒的工作。我在想,你能否推荐一个呈现两个变量关系的媒体资源?
你具体指的是什么?
需要快速帮助!
要衡量相似性,互相关是唯一的方法吗?我知道动态时间规整(DTW),但对于我正在处理的信号分类问题来说太耗时了。我需要一种能处理时间相关而不是像快速傅里叶变换那样处理频率内容的算法。
抱歉,我没有任何关于计算时间序列之间相似性的教程。我希望将来能涵盖这个主题。
嗨,Jason,
我创建了一个斯皮尔曼等级相关矩阵,其中每个比较都是在随机抽样的电流密度图之间进行的。这10张图是通过Circuitscape(使用电路理论)生成的,每张图都有一个独特的成本值范围(都分为三个等级:低、中、高。例如1、2、3或10、100、1000),用于生成每个电流密度图。总的来说,矩阵内的总体平均相关性为0.79,总体范围为0.52到0.99。其中4张图的成本值范围中,从中到高的阶乘变化是一个分数,并且小于从低到中的阶乘变化(例如1、2、3(2和1.5)或1、150、225(150和1.5)或1、1.5、2.25(1.5和1.5)),其平均范围为0.67到0.75。其他6张图都是整数,具有递增或偶数的阶乘变化,平均相关值范围为0.82到0.85。
是否有特定的原因,导致在成本值范围内,第二次阶乘变化小于第一次并且是一个分数(或者说包含一个小数位)会降低相关性值?
谢谢你
我不知道,抱歉。
嗨,Jason,
这是一篇很棒的文章。为了快速进行相关性分析,我找到了这个工具
https://www.answerminer.com/calculators/correlation-test
谢谢
谢谢。
你好,James,
如果我们没有任何领域知识,并且数据集中的行数和列数非常多,我们如何找到数据集中两行或两列之间的相关性?
*Jason
你可以找到列之间的相关性,例如特征。
不是在行之间,而是在两个特征的行之间。
谢谢你,Jason。
您能给一个如何找出列之间相关性的例子吗?
是的,上面的教程展示了如何操作。
嗨,Jason,
假设给定两个变量
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
我感到困惑,当我得到0.8时,意味着高相关性,如果我得到0,应该丢弃哪个变量?
如果它们不相关,就都保留。
嗨,Jason,
感谢这篇精彩的文章。我是个新手。
以下代码行是否正确?
corr,_ =pearsonr(0.599122807018,0.674224021592)
LoC 是什么?
代码行
嗨,Jason,
我知道上面的问题很蠢,因为相关性可能会产生NaN。我真正想问的是:如何找到不同分类器分类准确率之间的相关性并进行比较?
在这种情况下,比如说Knn的准确率是0.59,而DT的准确率是0.67。
请告诉我一种方法,以便从多个分类器中选择最好的几个来创建一个集成模型。
谢谢你
在为集成选择模型时,我们会根据分类器在测试集上的预测误差来监控它们之间的相关性,而不是根据它们的摘要统计数据,如准确率得分。
对于分类问题,我们可能会关注预测概率之间的相关性。
嗨 Jason
我有一个传感器数据集。传感器数据与温度有很强的(正)相关性。随着温度的变化,传感器的值也随之漂移。我需要补偿这种由温度引起的漂移。因此,我需要一种算法来抵消(中和)温度对我正在测量的主要变量的影响。
你能帮忙吗?
也许可以先尝试线性回归作为第一步?
嗨,Jason,
非常感谢您这篇有用的教程文章。
我的统计学基础不扎实,我想请问在相关矩阵中同时考虑分类变量和连续变量的情况下,哪种系数是合适的?
谢谢!
你必须使用不同的度量方法。
也许对实值变量使用皮尔逊相关性,对分类变量使用卡方检验。
如何进行单侧检验?当你知道要寻找的相关性类型(例如正相关)时?
谢谢你的帮助
也许这里的一些例子会有帮助
https://machinelearning.org.cn/statistical-hypothesis-tests-in-python-cheat-sheet/
你好,有没有什么方法可以从一个有数百个变量的特征空间中选择不相关的变量?我的意思是,如何从100个变量中选择不相关的变量。
提前感谢
通常我们反其道而行之,找出最相关的变量并移除它们,这被称为特征选择
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
你好,Jason。
我学习了您的文章。非常有趣,恭喜。
我有一个问题。斯皮尔曼方法可以用于两种情况:在线性关系的情况下,指示是否存在这种关系,以及在非线性关系的情况下,指示两个变量之间没有关系或者存在某种关系(线性或非线性)。
在斯皮尔曼系数非常高,意味着确实存在关系的情况下,我如何确定这两个变量具有哪种关系?换句话说,在两个变量相关的情况下,我如何知道这种关系是二次的、三次的等等?
感谢您的时间。
谢谢。
好问题。当两个数据集服从高斯分布时,使用线性方法;否则,使用排序方法。
谢谢,但我恐怕没太明白。更确切地说,在两个数据集服从高斯分布的情况下,线性方法将揭示是否存在线性关系。但如果没有线性关系,它并不能指出是否存在任何其他关系及其类型。在两个数据集不服从高斯分布的情况下,也会观察到同样的情况。排序方法将揭示是否存在关系,但绝不会指出它们可能具有的关系类型。是二次关系、三次关系还是什么?
我为坚持提问并问了这么一个可能“幼稚”的问题而道歉。
此致
这是个好问题。
是的,在这种情况下,可能需要秩相关。
如果我们不确定,可以绘制数据并进行检查,或者计算两种方法并审查它们的结果,也许还有p值。
嗨,Jason,
我想问一下,我正在使用逻辑回归对数据进行二元分类。现在这个数据集是我自己创建的,为了分类,我打算使用3个列作为特征,分别是[‘DESCRIPTION’,’NUMBER OF CASUALTIES’,’CLASSIFY’]。其中,‘DESCRIPTION’列是文本数据,‘NUMBER OF CASUALTIES’列是数值数据,最后一列‘CLASSIFY’是填充了0/1的列,用于帮助分类。现在我已经在‘CLASSIFY’列中将数据分成了0/1,也就是说我已经给出了分类的答案。现在对于逻辑回归模型,我正在考虑使用这3个列,以便我的测试数据能够被正确分类。您觉得这种方法怎么样?
试试看吧。
相关性在现实生活中有哪些应用?
一些想法
– 深入了解领域知识。
– 特征选择/移除。
– 模型选择。
– 数据准备选择。
非常感谢您的文章,请问在数据准备选择阶段,如何计算一个变量与所有其他变量之间的累积相关系数,而不是所有实值变量对之间的相关系数?这些变量是回归模型的输入数值和分类变量。
在此先感谢您
是的,我建议你使用sklearn库来帮你完成
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
谢谢Jason,又一篇精彩的文章。相关性的应用之一是特征选择/减少,如果你有多个高度相关的变量,你应该移除或保留哪些?
好问题,请看这个
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
谢谢Jason,通过这篇和其他教程帮助我们理解。我正在更广泛地思考非机器学习与机器学习环境下的相关性(和回归)。我的意思是:如果我对预测未知数据不感兴趣,如果我只对完全描述手头的数据感兴趣呢?只要我不拟合异常值,过拟合会不会成为一个好消息?那么有人可能会质疑,如果没有机器学习的意图,为什么还要使用Scikit/Keras/boosters进行回归——大概我可以辩解说,这些机器学习工具比传统的统计工具(许多工具要求/假设高斯分布等)更强大和灵活?
是的,描述性模型的目标与预测性模型非常不同。
嗨,Jason,谢谢你的解释。我有一个大小为6×1的仿射变换参数,我想对这些参数进行相关性分析。我找到了下面的公式(我不确定这是否是适合我目的的正确公式)。然而,我不明白如何实现这个公式。总的来说,我想要达到的结果应该是这样的。(https://lh3.googleusercontent.com/proxy/kbh85HHtDQJ0WLnemcxeGprtL6MJ7DgEs8banlEmGF5dh5Cjy1BGjrYGmhewbE8y99jzja64-8vC-KQ0Nld48HBFMU7EsgS4eAKFRvIQg1F9aXXr5rY6EbIRCY2gcbkiDjcMCgIgYVelwLKat4VAgje9N0I-x3rJgq5dD1XAu6pim_LWTatU8Py0cls)
我该如何实现这个,请帮帮我好吗?
公式: https://wikimedia.org/api/rest_v1/media/math/render/svg/2b9c2079a3ffc1aacd36201ea0a3fb2460dc226f
我没有能力为你编写代码。
一些想法
也许直接联系材料的作者?
也许找出你想要计算的指标的名称,看看它是否在scipy中直接可用?
也许找一个相似的指标,并修改实现以匹配你偏好的指标?
嗨,Jason。感谢这篇帖子。
如果我正在处理一个时间序列预测问题,我能用这些方法来看我的输入时间序列1是否与我的输入时间序列2相关吗?
是的,这被称为ACF和PACF图
https://machinelearning.org.cn/gentle-introduction-autocorrelation-partial-autocorrelation/
非常感谢你把相关性这个主题解释得如此简单。
我有一些疑问,请帮我解答。
1. 如果我们知道两个变量有线性关系,我们应该考虑协方差还是皮尔逊相关系数?或者还有其他参数需要考虑吗?
2. 总是使用斯皮尔曼相关系数是否可取?
是的,如果你期望有线性关系,就使用皮尔逊系数或协方差。
不,你希望为你的数据使用最强大的检验方法。
嗨,Jason,
非常感谢您的文章,它很有启发性。
我有一个问题:我有很多特征(大约900个)和很多行(大约一百万),我想找出我的特征之间的相关性,以便去掉其中一些。因为我不知道它们是如何关联的,我尝试使用斯皮尔曼相关矩阵,但效果不好(几乎所有的系数都是NaN值...)。我认为这是因为我的数据集中有很多零。
您知道有什么方法可以解决这个问题吗?
非常感谢
不客气!
我建议使用自动化的特征选择方法
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
嗨,Jason,感谢这篇精彩的教程。我只是对您解释样本协方差计算的部分感到好奇,您提到“在计算中使用均值表明每个数据样本需要具有高斯或类高斯分布”。我不确定为什么如果我们使用样本的均值,样本就必须是类高斯的。您能详细说明一下,或者给我一些额外的资源吗?谢谢。
如果数据呈偏态分布或指数分布,正常计算的均值将不是中心趋势(指数分布的均值记忆中是1/lambda),这会影响协方差的计算。
嗨,Jason,
谢谢这篇优秀的文章。
根据您的书,我正在尝试为任何数据集在进行ML预测或分类之前,在探索性数据分析(EDA)期间制定一个标准的任务/流程工作流。
假设我有一个混合了数值和分类变量的数据集,我正在尝试为下面的第3步找出正确的逻辑。
这是我目前提出的工作流程
1. 为所有属性生成直方图和KDE图,以便我能看出哪些是正态分布的。
2. 生成一个散点图矩阵,以便我能看出每个属性对是线性关系、单调关系还是没有明显关系。如果我计划执行分类任务,则额外在目标变量上使用色调(hue),以便我能看出每个属性配对中每个类别是否有额外的模式。
3. 然后对于我散点图矩阵中的每个属性对
3.1. 如果属性对是2个数值属性,并且它们有线性关系,并且都是正态分布的,那么对这个属性对使用皮尔逊相关性。
3.2. 如果属性对是2个数值属性,但它们有非线性的单调关系(例如指数关系),并且都是正态分布的,那么对这个属性对使用斯皮尔曼相关性。
3.3. 如果属性对是2个数值属性,并且它们有线性关系,但其中一个/两个不是正态分布的,那么对这个属性对使用斯皮尔曼相关性。
3.4. 如果属性对是2个数值属性,但它们有非线性的单调关系(例如指数关系),并且其中一个或两个都不是正态分布的,那么对这个属性对使用斯皮尔曼相关性。
3.5. 如果属性对是2个分类属性,那么对这个属性对使用斯皮尔曼相关性。
4. 识别所有皮尔逊被确定为适当选择的属性对——仅为这些属性生成一个相关矩阵。
5. 识别所有斯皮尔曼被确定为适当选择的属性对——仅为这些属性生成一个相关矩阵。
问题
A. 斯皮尔曼相关性只能用于有序分类变量,还是可以用于任何类型的分类变量?如果只是前者,那么我有什么选择——我应该对2个名义分类变量使用卡方检验而不是相关性吗?
B. 如果我确定斯皮尔曼是合适的选择,那么我是否也应该用肯德尔tau生成一个相同的相关矩阵,看看哪个能在这两者之间产生最强的相关值?
C. 如果一个属性是数值的,一个是序数分类的,那么我是否只对这个属性对使用斯皮尔曼相关性?
感谢您提供如此出色的实用资源。
Maleko
我预计斯皮尔曼可以用于序数数据。也许可以查阅“进一步阅读”部分列出的教科书。
如果你愿意的话。
也许可以,或者方差分析(ANOVA)或互信息可能更合适。这可能会有帮助。
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
抱歉,我漏掉了另一个问题
D. 我描述的上述工作流程对于包含大量特征的数据集来说似乎相当复杂。
与其处理混合的数值和分类特征(其中一些是序数的,一些是名义的),我是否最好先将所有分类属性更改为数值数据类型(例如使用get_dummies或其他类型的编码),然后遵循所述的其余工作流程?
如果这个问题太大了,请见谅,非常喜欢您的文章,但我觉得我读得越多,问题就越多!
谢谢
可能不会。
这是一篇解释协方差和相关性之间差异的好文章
https://www.surveygizmo.com/resources/blog/variance-covariance-correlation/
感谢分享。
我有个问题,如果我的输入变量是连续的,输出变量是二元的,我该如何检查这两者之间的相关性?我应该使用斯皮尔曼相关性吗?在这种情况下,我是否应该测量相关性?
不,那将是无效的,请看这里
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
我有个问题,在这一行,
corr, _ = pearsonr(data1, data2)
为什么在corr后面必须加上 , _ ,我知道不加它就不行,但为什么呢?
为了忽略函数返回的其中一个值。
使用下划线(“_”)是Python中忽略一个变量的习惯用法。
亲爱的 Jason,
我参考了您的许多教程,它们总能帮助我提高对机器学习概念的理解。
您的工作是一种激励。感谢您。
不客气!
很棒的教程!
谢谢!
“协方差值为零表示两个变量完全独立。”
实际上,独立变量的相关性为0,但相关性为0并不总是意味着独立。
发现得好!
感谢这篇帖子,我有一个问题。您生成的值是针对高斯分布的。我的问题是,您将如何生成PERT分布中的随机值?提前感谢。
你可以查看numpy的API,了解如何在任意分布中生成随机数。
Jason博士您好,
关于如何用Python进行NLP主题相关性分析,您有什么指点吗?我使用了pyLDAvis进行可视化主题相关性分析,但找不到一种方法以表格格式获取相关性?
以下是关于该主题的参考链接,以便更清晰地说明:https://towardsdatascience.com/end-to-end-topic-modeling-in-python-latent-dirichlet-allocation-lda-35ce4ed6b3e0
谢谢!
Luxman
我想你正在寻找scikit-learn中的这个函数: https://scikit-learn.cn/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html
亲爱的Jason您好,
非常感谢您提供这些精彩的材料。我有一个关于我目前项目的问题。
我有这样一个场景(https://ibb.co/F0WBtJq),一辆汽车通过无线网络向一个代理(broker)和一个App发布一条消息,经过处理后,App通过无线网络将同样的消息发送给另一辆汽车。
现在我需要分析延迟。所有延迟都正常,除了delay5有很高且异常的值。我想找出这种行为的根本原因,但我不知道如何做,也不知道什么样的机器学习/非机器学习技术适合解决这类问题。您有什么想法或参考资料可以指导我吗?
谢谢
嗨 Eshan...你可能希望分析你的系统中的异常和离群值,以更好地理解因果关系。
https://machinelearning.org.cn/how-to-identify-outliers-in-your-data/
https://machinelearning.org.cn/model-based-outlier-detection-and-removal-in-python/
嗨
我的问题是关于这篇文章的反向操作
我们如何定义或分配两个随机变量之间的相关性?
例如,我需要多次使用对数正态分布并从中生成数据集;但在论文中写道数据集之间的相关性是0.6
我如何给我的数据分配相关性?
谢谢
嗨 javad...你可能会对以下内容感兴趣
https://www.projectguru.in/how-to-improve-the-correlation-between-the-variables/
谢谢。现在我知道什么是相关性以及如何计算它等等。但我不明白的是,我该如何利用这些信息?比如,我如何利用这些信息来改进我的模型?
嗨 Nikhil...你可能会觉得以下内容有帮助
https://medium.com/analytics-vidhya/what-is-correlation-4fe0c6fbed47
你好,谢谢您的解释。
当数据集有缺失值时,相关性是否可靠?
嗨 Ali...以下资源可能对你感兴趣
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4145345/
我根据一个分类变量的值将一个数据框分成了五个子集。我计算了预测变量和目标变量的每个对应子集之间的相关系数,得到了5个相关系数。我希望比较这5个相关系数,以确定这5个组之间是否存在任何统计学上的显著差异。我想使用单因素方差分析(One Way ANOVA)或费雪Z检验(Fisher's Z Test)来评估所有5个系数都相等的零假设。请就方法和代码提供建议。谢谢。
嗨 Jon...你可能会对以下位置感兴趣
https://machinelearning.org.cn/start-here/#statistical_methods
嗨 Jason,感谢您的文章。我听说过假设检验。我们不能通过假设检验来检查或决定这两个变量是否相关吗?如果可以,什么时候使用假设检验,什么时候使用协方差和相关性来决定关系?
嗨 Kenneth…是的,假设检验、协方差和相关性都是用来评估变量之间关系的统计工具,但它们的目的不同,在不同的情境中使用。
1. **假设检验**:假设检验是一种统计方法,用于根据样本数据对总体参数进行推断。它可以用来检验两组之间是否存在显著差异,或者变量之间是否存在关系。在变量关系的情境下,假设检验可以用来测试相关系数(衡量两个变量之间线性关系的强度和方向)是否显著不为零。这有助于确定两个变量之间是否存在显著的线性关系。
2. **协方差**:协方差衡量两个变量一起变化的程度。正协方差表示一个变量增加时,另一个变量也倾向于增加;而负协方差表示一个变量增加时,另一个变量倾向于减少。然而,协方差的大小取决于变量的单位,这使得解释变得困难。因此,协方差通常被标准化以得到相关性。
3. **相关性**:相关性是衡量两个变量之间线性关系强度和方向的标准化度量。与协方差不同,相关性是无单位的,范围在-1到1之间。相关系数为1表示完全正线性关系,-1表示完全负线性关系,0表示没有线性关系。相关性通常比协方差更受青睐,因为它提供了一个标准化的度量,更易于解释和在不同数据集之间进行比较。
所以,在决定两个变量是否相关时,你可以同时使用相关性和假设检验。相关性为你提供了关系强度和方向的度量,而假设检验则帮助你确定这种关系是否具有统计显著性。如果你发现两个变量之间有很强的相关性,你可以使用假设检验来确定这种相关性是显著的还是由随机机会造成的。