Machine Learning Mastery 统计学教程(三)
机器学习中的评估统计的温和介绍
原文:
machinelearningmastery.com/estimation-statistics-for-machine-learning/
统计假设检验可用于指示两个样本之间的差异是否是由于随机机会,但不能评论差异的大小。
被称为“_ 新统计 ”的一组方法正在增加使用而不是 p 值或者除了 p 值之外,以便量化效应的大小和估计值的不确定性的量。这组统计方法被称为“ 估计统计 _”。
在本教程中,您将发现对估计统计量的温和介绍,作为统计假设检验的替代或补充。
完成本教程后,您将了解:
- 效应大小方法涉及量化样本之间的关联或差异。
- 区间估计方法涉及量化点估计周围的不确定性。
- Meta 分析涉及量化多个类似独立研究中影响的程度。
让我们开始吧。
机器学习估算统计的温和介绍 NicolásBoullosa的照片,保留一些权利。
教程概述
本教程分为 5 个部分;他们是:
- 假设检验的问题
- 估算统计
- 规模效应
- 区间估计
- Meta 分析
假设检验的问题
统计假设检验和 p 值的计算是呈现和解释结果的流行方式。
像 Student's t 检验这样的测试可用于描述两个样本是否具有相同的分布。它们可以帮助解释两个样本均值之间的差异是否真实或由于随机机会。
虽然它们被广泛使用,但它们存在一些问题。例如:
- 计算的 p 值很容易被误用和误解。
- 即使差异很小,样本之间总会有一些显着差异。
有趣的是,在过去的几十年里,人们一直在反对在研究报告中使用 p 值。例如,在 20 世纪 90 年代,流行病学的期刊禁止使用 p 值。医学和心理学的许多相关领域也纷纷效仿。
尽管仍然可以使用 p 值,但是使用估计统计量推动了结果的呈现。
估算统计
估计统计是指尝试量化发现的方法。
这可能包括量化效果的大小或特定结果或结果的不确定性的数量。
......'估算统计',一个术语,描述着重于效果大小估计(点估计)及其置信区间(精确估计)的方法。
估算统计是描述三种主要方法类别的术语。三类主要方法包括:
- 效果大小。用于量化治疗或干预的效果大小的方法。
- 区间估计。量化值的不确定性的方法。
- Meta 分析。在多个类似研究中量化结果的方法。
我们将在以下部分中更详细地介绍这些方法组。
虽然它们并不是新的,但它们被称为“_ 新统计 _”,因为它们在统计假设检验的研究文献中的使用越来越多。
新的统计量涉及估计,荟萃分析和其他技术,帮助研究人员将重点从[零假设统计检验]转移。这些技术并不是新的,并且通常用于某些学科,但对于[零假设统计检验]学科,它们的使用将是新的和有益的。
- 了解新统计:影响大小,置信区间和元分析,2012。
从统计假设方法向估计系统转变的主要原因是结果更容易在领域或研究问题的背景下进行分析和解释。
效果和不确定性的量化大小允许声明更容易理解和使用。结果更有意义。
知道和思考效应的幅度和精确度对于定量科学比考虑观察至少那个极端数据的概率更有用,假设绝对没有效果。
— Estimation statistics should replace significance testing, 2016.
在统计假设检验谈论样本是否来自相同分布的情况下,估计统计可以描述差异的大小和置信度。这允许您评论一种方法与另一种方法的不同之处。
估计思维的重点是效果有多大;知道这通常比知道效果是否为零更有价值,这是二元思维的四肢。估计思维促使我们计划一个实验,以解决“多少......?”或“在多大程度上??”的问题,而不仅仅是二分法无效假设统计检验的问题,“有效果吗?”
— Understanding The New Statistics: Effect Sizes, Confidence Intervals, and Meta-Analysis, 2012.
规模效应
效应大小描述了治疗的大小或两个样本之间的差异。
假设检验可以评论样本之间的差异是偶然的结果还是真实的结果,而效应大小则表示样本的差异程度。
测量效果的大小是应用机器学习的重要组成部分,事实上,研究也是如此。
我有时被问到,研究人员做了什么?简短的回答是我们估计效果的大小。无论我们选择研究什么样的现象,我们基本上都在花费我们的职业生涯来思考新的更好的方法来估计效应量。
- 第 3 页,影响大小的基本指南:统计功效,Meta 分析和研究结果的解释,2010。
有两种主要的技术用于量化影响的程度;他们是:
- 协会。两个样本一起变化的程度。
- 差异。两个样本不同的程度。
例如,关联效应大小包括相关性的计算,例如 Pearson 相关系数和 r ^ 2 确定系数。它们可以量化两个样本中的观察结果一起变化的线性或单调方式。
差异效应大小可以包括诸如科恩统计量的方法,其提供关于两个群体的平均值如何不同的标准化度量。他们寻求量化两个样本中观察值之间差异的大小。
效果可以是在组(例如,治疗组和未治疗组)之间的比较中显示的治疗的结果,或者它可以描述两个相关变量(例如治疗剂量和健康)之间的关联程度。
- 第 4 页,影响大小的基本指南:统计力量,Meta 分析和研究结果的解释,2010。
区间估计
区间估计是指用于量化观察的不确定性的统计方法。
间隔将点估计转换为一个范围,该范围提供有关估计的更多信息,例如其精度,使其更易于比较和解释。
点估计是点,间隔表示这些点估计的不确定性。
- 第 9 页,了解新统计:影响大小,置信区间和元分析,2012。
通常计算有三种主要类型的间隔。他们是:
- 容差区间:具有特定置信水平的分布的一定比例的界限或覆盖范围。
- 置信区间:总体参数估计的界限。
- 预测区间:单次观察的界限。
公差区间可用于设定对群体中观察的期望或帮助识别异常值。置信区间可用于解释数据样本的平均值的范围,随着样本量的增加,该范围可以变得更加精确。预测间隔可用于从模型提供预测或预测的范围。
例如,当呈现模型的平均估计技能时,可以使用置信区间来提供估计精度的界限。如果要比较模型,这也可以与 p 值组合。
因此,置信区间为人口价值提供了一系列可能性,而不是仅基于统计显着性的任意二分法。它以牺牲 P 值的精度为代价传达更多有用的信息。然而,除了置信区间之外,实际 P 值是有用的,并且优选地两者都应该被呈现。但是,如果必须排除一个,那么它应该是 P 值。
- 置信区间而不是 P 值:估计而不是假设检验,1986。
Meta 分析
荟萃分析指的是使用多个相似研究的权重来量化更广泛的交叉研究效果。
当许多小型和类似的研究已经进行了嘈杂和相互矛盾的研究时,Meta 研究很有用。与其以任何单一研究相比,统计学方法不是将研究结论用于面值,而是将多项研究结果结合起来。
...更好地称为荟萃分析,完全忽略了其他人所得出的结论,而忽视了已经观察到的效果。目的是将这些独立观察结果与平均效应大小相结合,并得出关于现实世界效应的方向和幅度的总体结论。
- 第 90 页,影响大小的基本指南:统计功效,Meta 分析和研究结果的解释,2010。
尽管不常用于应用机器学习,但有必要注意元分析,因为它们构成了新统计方法信任的一部分。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 描述如何在机器学习项目中使用估算统计量的三个示例。
- 找出并总结三种对使用统计假设检验的批评。
- 搜索并找到三篇利用区间估计的研究论文。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
图书
- 了解新统计:影响大小,置信区间和元分析,2012。
- 新统计学概论:估计,开放科学及其他,2016 年。
- 影响大小的基本指南:统计力量,Meta 分析和研究结果的解释,2010。
文件
用品
- 维基百科的估算统计
- 维基百科上的效果大小
- 维基百科的间隔估计
- 维基百科上的元分析
摘要
在本教程中,您发现了对估计统计量的温和介绍,作为统计假设检验的替代或补充。
具体来说,你学到了:
- 效应大小方法涉及量化样本之间的关联或差异。
- 区间估计方法涉及量化点估计周围的不确定性。
- Meta 分析涉及量化多个类似独立研究中影响的程度。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何在 Python 中计算非参数秩相关性
原文:
machinelearningmastery.com/how-to-calculate-nonparametric-rank-correlation-in-python/
相关性是两个变量之间关联的度量。
当两个变量都具有良好理解的高斯分布时,很容易计算和解释。当我们不知道变量的分布时,我们必须使用非参数秩相关方法。
在本教程中,您将发现用于量化具有非高斯分布的变量之间的关联的等级相关方法。
完成本教程后,您将了解:
- 排名相关方法如何工作以及方法是否可用。
- 如何在 Python 中计算和解释 Spearman 的秩相关系数。
- 如何在 Python 中计算和解释 Kendall 的秩相关系数。
让我们开始吧。
教程概述
本教程分为 4 个部分;他们是:
- 等级相关
- 测试数据集
- 斯皮尔曼的秩相关
- 肯德尔的秩相关
等级相关
相关性是指两个变量的观测值之间的关联。
变量可能具有正关联,这意味着随着一个变量的值增加,另一个变量的值也增加。该关联也可以是否定的,意味着随着一个变量的值增加,其他变量的值减小。最后,关联可能是中性的,这意味着变量不相关。
相关性量化这种关联,通常作为值-1 到 1 之间的度量,完全负相关和完全正相关。计算的相关性被称为“_ 相关系数 _。”然后可以解释该相关系数以描述测量。
请参阅下表以帮助解释相关系数。
相关系数值表及其解释 取自“非统计学家的非参数统计:逐步法”。
可以使用诸如 Pearson 相关的标准方法来计算每个具有高斯分布的两个变量之间的相关性。此过程不能用于没有高斯分布的数据。相反,必须使用等级相关方法。
秩相关是指使用值之间的序数关系而不是特定值来量化变量之间的关联的方法。序数据是具有标签值并具有顺序或等级关系的数据;例如:'_ 低 ',' 训练基 '和' 高 _'。
可以针对实值变量计算秩相关性。这是通过首先将每个变量的值转换为等级数据来完成的。这是值的排序位置,并赋予整数排名值。然后可以计算秩相关系数以量化两个排序变量之间的关联。
因为没有假设值的分布,所以秩相关方法被称为无分布相关或非参数相关。有趣的是,秩相关度量通常被用作其他统计假设检验的基础,例如确定两个样本是否可能来自相同(或不同)的人口分布。
秩相关方法通常以研究人员或开发该方法的研究人员的名字命名。秩相关方法的四个例子如下:
- 斯皮尔曼的秩相关。
- 肯德尔的秩相关。
- Goodman 和 Kruskal 的秩相关。
- 萨默斯的秩相关。
在接下来的部分中,我们将仔细研究两种更常见的排名相关方法:Spearman 和 Kendall。
测试数据集
在我们演示秩相关方法之前,我们必须首先定义一个测试问题。
在本节中,我们将定义一个简单的双变量数据集,其中每个变量是从均匀分布(例如非高斯分布)绘制的,第二个变量的值取决于第一个值的值。
具体而言,从均匀分布中抽取 1,000 个随机浮点值的样本,并缩放到 0 到 20 的范围。从 0 到 10 之间的均匀分布中抽取 1,000 个随机浮点值的第二个样本,并将其添加到第一个创建关联的示例。
# prepare data
data1 = rand(1000) * 20
data2 = data1 + (rand(1000) * 10)
下面列出了完整的示例。
# generate related variables
from numpy.random import rand
from numpy.random import seed
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
data1 = rand(1000) * 20
data2 = data1 + (rand(1000) * 10)
# plot
pyplot.scatter(data1, data2)
pyplot.show()
运行该示例将生成数据样本并绘制散点图上的点。
我们可以清楚地看到每个变量具有均匀分布,并且通过从图的左下到右上角的点的对角分组可以看到变量之间的正相关。
从均匀分布绘制的相关变量的散点图
斯皮尔曼的秩相关
斯皮尔曼的等级相关以查尔斯斯皮尔曼命名。
它也可以称为斯皮尔曼相关系数,并用小写希腊字母 rho(p)表示。因此,它可以被称为 Spearman 的 rho。
该统计方法量化了排序变量与单调函数相关联的程度,意味着增加或减少的关系。作为统计假设检验,该方法假设样本不相关(不能拒绝 H0)。
Spearman 等级相关是一种统计过程,旨在测量顺序测量尺度上两个变量之间的关系。
- 第 124 页,非统计学家的非参数统计:循序渐进的方法,2009。
Spearman 等级相关性的直觉是它使用秩值而不是实际值来计算 Pearson 相关性(例如,相关性的参数度量)。 Pearson 相关性是通过两个变量的方差或扩展归一化的两个变量之间的协方差(或平均观测值的预期差异)的计算。
Spearman 的等级相关性可以使用 spearmanr()SciPy 函数在 Python 中计算。
该函数将两个实值样本作为参数,并返回介于-1 和 1 之间的相关系数以及用于解释系数重要性的 p 值。
# calculate spearman's correlation
coef, p = spearmanr(data1, data2)
我们可以在测试数据集上演示 Spearman 的等级相关性。我们知道数据集中的变量之间存在很强的关联,我们希望 Spearman 的测试能够找到这种关联。
The complete example is listed below.
# calculate the spearman's correlation between two variables
from numpy.random import rand
from numpy.random import seed
from scipy.stats import spearmanr
# seed random number generator
seed(1)
# prepare data
data1 = rand(1000) * 20
data2 = data1 + (rand(1000) * 10)
# calculate spearman's correlation
coef, p = spearmanr(data1, data2)
print('Spearmans correlation coefficient: %.3f' % coef)
# interpret the significance
alpha = 0.05
if p > alpha:
print('Samples are uncorrelated (fail to reject H0) p=%.3f' % p)
else:
print('Samples are correlated (reject H0) p=%.3f' % p)
运行该示例计算测试数据集中两个变量之间的 Spearman 相关系数。
统计检验报告与 0.9 的值呈强正相关。 p 值接近于零,这意味着在给定样本不相关的情况下观察数据的可能性是非常不可能的(例如 95%置信度),并且我们可以拒绝样本不相关的零假设。
Spearmans correlation coefficient: 0.900
Samples are correlated (reject H0) p=0.000
肯德尔的秩相关
Kendall 的等级相关以 Maurice Kendall 的名字命名。
它也被称为肯德尔的相关系数,系数通常用小写希腊字母 tau(t)表示。反过来,测试可能被称为肯德尔的头。
测试的直觉是它计算两个样本之间匹配或一致排名数的标准化分数。因此,该测试也称为肯德尔的一致性测试。
Kendall 的秩相关系数可以使用 kendalltau()SciPy 函数在 Python 中计算。测试将两个数据样本作为参数,并返回相关系数和 p 值。作为统计假设检验,该方法假设(H0)两个样本之间没有关联。
# calculate kendall's correlation
coef, p = kendalltau(data1, data2)
我们可以在测试数据集上演示计算,我们确实希望报告显着的正关联。
The complete example is listed below.
# calculate the kendall's correlation between two variables
from numpy.random import rand
from numpy.random import seed
from scipy.stats import kendalltau
# seed random number generator
seed(1)
# prepare data
data1 = rand(1000) * 20
data2 = data1 + (rand(1000) * 10)
# calculate kendall's correlation
coef, p = kendalltau(data1, data2)
print('Kendall correlation coefficient: %.3f' % coef)
# interpret the significance
alpha = 0.05
if p > alpha:
print('Samples are uncorrelated (fail to reject H0) p=%.3f' % p)
else:
print('Samples are correlated (reject H0) p=%.3f' % p)
运行该示例将 Kendall 的相关系数计算为 0.7,这是高度相关的。
与 Spearman 测试一样,p 值接近于零(并打印为零),这意味着我们可以放心地拒绝样本不相关的零假设。
Kendall correlation coefficient: 0.709
Samples are correlated (reject H0) p=0.000
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 列举三个示例,其中计算非参数相关系数在机器学习项目期间可能是有用的。
- 更新每个示例以计算从非高斯分布中提取的不相关数据样本之间的相关性。
- 加载标准机器学习数据集并计算所有变量之间的成对非参数相关性。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
图书
- 非统计人员的非参数统计:循序渐进的方法,2009 年。
- 应用非参数统计方法,第四版,2007。
- 秩相关方法,1990。
API
用品
- 维基百科上的非参数统计
- 维基百科上的排名相关
- Spearman 在维基百科上的等级相关系数
- 维基百科上的肯德尔等级相关系数
- Goodman 和 Kruskal 在维基百科上的伽玛
- 维基百科上的 Somers'D
摘要
在本教程中,您发现了用于量化具有非高斯分布的变量之间的关联的等级相关方法。
具体来说,你学到了:
- 排名相关方法如何工作以及方法是否可用。
- 如何在 Python 中计算和解释 Spearman 的秩相关系数。
- 如何在 Python 中计算和解释 Kendall 的秩相关系数。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何在 Python 中计算数据的五个数字摘要
原文:
machinelearningmastery.com/how-to-calculate-the-5-number-summary-for-your-data-in-python/
数据汇总提供了一种方便的方法来描述数据样本中的所有值,只需几个统计值。
平均值和标准差用于汇总具有高斯分布的数据,但如果您的数据样本具有非高斯分布,则可能没有意义,甚至可能具有误导性。
在本教程中,您将发现用于描述数据样本分布的五个数字摘要,而不假设特定的数据分布。
完成本教程后,您将了解:
- 数据汇总(例如计算均值和标准差)仅对高斯分布有意义。
- 五个数字摘要可用于描述具有任何分布的数据样本。
- 如何计算 Python 中的五位数摘要。
让我们开始吧。
如何在 Python 中计算数据的 5 位数摘要 照片由 Masterbutler ,保留一些权利。
教程概述
本教程分为 4 个部分;他们是:
- 非参数数据摘要
- 五位数总结
- 如何计算五位数汇总
- 使用五位数摘要
非参数数据摘要
数据汇总技术提供了一种使用一些关键测量来描述数据分布的方法。
最常见的数据汇总示例是计算具有高斯分布的数据的均值和标准差。仅使用这两个参数,您就可以理解并重新创建数据的分布。数据摘要可以压缩几十或几百万个别观察。
问题是,您不能轻易计算出没有高斯分布的数据的均值和标准差。从技术上讲,您可以计算这些数量,但它们并未总结数据分布;事实上,他们可能会产生误导。
对于没有高斯分布的数据,您可以使用五个数字摘要汇总数据样本。
五位数总结
五个数字摘要或简称为 5 个数字的摘要是非参数数据摘要技术。
它有时被称为 Tukey 5 号码摘要,因为它是由 John Tukey 推荐的。它可用于描述具有任何分布的数据的数据样本的分布。
作为一般用途的标准摘要,5 号摘要提供了正确的详细信息量。
- 第 37 页,理解稳健和探索性数据分析,2000。
五位数摘要涉及 5 个汇总统计量的计算:即:
- 中位数:样本中的中间值,也称为第 50 个百分位数或第 2 个四分位数。
- 第一四分位数:第 25 个百分点。
- 第三四分位数:第 75 个百分点。
- 最小:样本中的最小观察值。
- 最大值:样本中最大的观察值。
四分位数是一个点上的观察值,有助于将有序数据样本分成四个大小相等的部分。中位数或第二四分位数将有序数据样本分成两部分,第一和第三四分位数将这些半部分分成四部分。
百分位数是在有助于将有序数据样本分成 100 个相等大小的部分的点处的观察值。四分位数通常也表示为百分位数。
四分位数和百分位数值都是排名统计的示例,可以在具有任何分布的数据样本上计算。它们用于快速总结分布中有多少数据落后于给定观察值。例如,一半的观察结果落在分布的中位数之前和之前。
注意,四分位数也在框和须状图中计算,这是一种非参数方法,用于图形化地总结数据样本的分布。
如何计算五位数汇总
计算五位数摘要包括查找每个四分位数的观测值以及数据样本的最小和最大观测值。
如果四分位数的有序数据样本中没有特定值,例如,如果有偶数个观察值并且我们试图找到中位数,那么我们可以计算两个最接近的值的平均值,例如两个中间价值观。
我们可以使用百分位() NumPy 函数在 Python 中计算任意百分位数值。我们可以使用此函数来计算第 1,第 2(中位数)和第 3 四分位数值。该函数采用观察数组和浮点值来指定要在 0 到 100 范围内计算的百分位数。它还可以采用百分位数值列表来计算多个百分位数;例如:
quartiles = percentile(data, [25, 50, 75])
默认情况下,如果需要,函数将计算观察值之间的线性插值(平均值),例如在计算具有偶数值的样本的中值的情况下。
NumPy 函数 min()和 max()可用于返回数据样本中的最小值和最大值;例如:
data_min, data_max = data.min(), data.max()
我们可以把所有这些放在一起。
下面的示例生成从 0 到 1 之间的均匀分布绘制的数据样本,并使用五个数字摘要对其进行汇总。
# calculate a 5-number summary
from numpy import percentile
from numpy.random import rand
# generate data sample
data = rand(1000)
# calculate quartiles
quartiles = percentile(data, [25, 50, 75])
# calculate min/max
data_min, data_max = data.min(), data.max()
# print 5-number summary
print('Min: %.3f' % data_min)
print('Q1: %.3f' % quartiles[0])
print('Median: %.3f' % quartiles[1])
print('Q3: %.3f' % quartiles[2])
print('Max: %.3f' % data_max)
运行该示例将生成数据样本并计算五个数字摘要以描述样本分布。
我们可以看到观察的传播接近我们的预期,第 50 百分位数为 0.27,第 50 百分位数为 0.53,第 75 百分位数为 0.76,接近理想值分别为 0.25,0.50 和 0.75。
Min: 0.000
Q1: 0.277
Median: 0.532
Q3: 0.766
Max: 1.000
使用五位数摘要
可以针对具有任何分布的数据样本计算五个数字摘要。
这包括具有已知分布的数据,例如高斯分布或类高斯分布。
我建议总是计算五个数字的摘要,并且只能继续分发特定的摘要,例如高斯的均值和标准差,以便您可以识别数据所属的分布。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 在机器学习项目中描述三个示例,其中可以计算五个数字摘要。
- 生成具有高斯分布的数据样本并计算五个数字摘要。
- 编写一个函数来计算任何数据样本的 5 个数字摘要。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
图书
- 理解稳健和探索性数据分析,2000。
API
用品
摘要
在本教程中,您发现了五个数字摘要,用于描述数据样本的分布,而不假设特定的数据分布。
具体来说,你学到了:
- 数据汇总(例如计算均值和标准差)仅对高斯分布有意义。
- 五个数字摘要可用于描述具有任何分布的数据样本。
- 如何计算 Python 中的五位数摘要。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何在 Python 中从零开始编写 T 检验
原文:
machinelearningmastery.com/how-to-code-the-students-t-test-from-scratch-in-python/
也许最广泛使用的统计假设检验之一是 T 检验。
因为有一天你可能会自己使用这个测试,所以深入了解测试的工作原理非常重要。作为开发人员,通过从零开始实现假设检验,可以最好地实现这种理解。
在本教程中,您将了解如何在 Python 中从零开始实现 Student's t 检验统计假设检验。
完成本教程后,您将了解:
- 学生的 t 检验将评论是否可能观察到两个样本,因为样本来自同一人群。
- 如何从零开始实现 T 检验两个独立样本。
- 如何从零开始对两个相关样本实现配对 T 检验。
让我们开始吧。
如何在 Python 中从零开始编写 T 检验 照片由 n1d ,保留一些权利。
教程概述
本教程分为三个部分;他们是:
- 学生的 t-测试
- 学生对独立样本的 t 检验
- 学生对依赖样本的 t 检验
学生的 t-测试
T 检验是一项统计假设检验,用于检验是否预期两个样本来自同一人群。
它以 William Gosset 使用的化名“Student”命名,他开发了该测试。
测试通过检查来自两个样品的平均值来确定它们是否彼此显着不同。它通过计算均值之间差异的标准误差来做到这一点,如果两个样本具有相同的均值(零假设),可以解释为差异的可能性。
通过将其与来自 t 分布的临界值进行比较,可以解释通过测试计算的 t 统计量。可以使用自由度和百分点函数(PPF)的显着性水平来计算临界值。
我们可以在双尾检验中解释统计值,这意味着如果我们拒绝零假设,那可能是因为第一个均值小于或大于第二个均值。为此,我们可以计算检验统计量的绝对值,并将其与正(右尾)临界值进行比较,如下所示:
- 如果 abs(t-statistic)< =临界值:接受平均值相等的零假设。
- 如果 abs(t-statistic)>临界值:拒绝平均值相等的零假设。
我们还可以使用 t 分布的累积分布函数(CDF)来检索观察 t 统计量的绝对值的累积概率,以便计算 p 值。然后可以将 p 值与选择的显着性水平(α)(例如 0.05)进行比较,以确定是否可以拒绝原假设:
- 如果 p> alpha :接受平均值相等的零假设。
- 如果 p <= alpha :拒绝零假设,即平均值相等。
在处理样本的平均值时,测试假设两个样本都是从高斯分布中提取的。该测试还假设样本具有相同的方差和相同的大小,尽管如果这些假设不成立,则对测试进行校正。例如,参见 Welch 的 t 检验。
Student's t-test 有两个主要版本:
- 独立样本。两个样本不相关的情况。
- 相关样本。样本相关的情况,例如对同一群体的重复测量。也称为配对测试。
独立和依赖学生的 t 检验分别通过 ttest_ind()和 ttest_rel() SciPy 函数在 Python 中提供。
注意:我建议使用这些 SciPy 函数计算应用程序的 Student t 检验,如果它们合适的话。库实现将更快,更不容易出错。我只建议您出于学习目的自行实现测试,或者在需要修改测试版本的情况下。
我们将使用 SciPy 函数来确认我们自己的测试版本的结果。
请注意,作为参考,本教程中提供的所有计算都直接取自“ [t _T 测试 _”中的“ T Tests”,第三版,2010 年。我提到这一点是因为您可能会看到具有不同形式的方程式,具体取决于您使用的参考文本。
学生对独立样本的 t 检验
我们将从最常见的 T 检验形式开始:我们比较两个独立样本的平均值的情况。
计算
两个独立样本的 t 统计量的计算如下:
t = observed difference between sample means / standard error of the difference between the means
要么
t = (mean(X1) - mean(X2)) / sed
其中X1和X2是第一和第二数据样本而sed是平均值之差的标准误差。
平均值之间差异的标准误差可以计算如下:
sed = sqrt(se1² + se2²)
其中se1和se2是第一和第二数据集的标准误差。
样本的标准误差可以计算为:
se = std / sqrt(n)
当se是样品的标准误差时,std是样品标准偏差,n是样品中的观察数。
这些计算做出以下假设:
- 样本是从高斯分布中提取的。
- 每个样本的大小大致相等。
- 样本具有相同的方差。
履行
我们可以使用 Python 标准库,NumPy 和 SciPy 中的函数轻松实现这些方程。
假设我们的两个数据样本存储在变量data1和data2中。
我们可以从计算这些样本的平均值开始,如下所示:
# calculate means
mean1, mean2 = mean(data1), mean(data2)
我们在那里一半。
现在我们需要计算标准误差。
我们可以手动完成,首先计算样本标准偏差:
# calculate sample standard deviations
std1, std2 = std(data1, ddof=1), std(data2, ddof=1)
然后是标准错误:
# calculate standard errors
n1, n2 = len(data1), len(data2)
se1, se2 = std1/sqrt(n1), std2/sqrt(n2)
或者,我们可以使用sem()SciPy 函数直接计算标准误差。
# calculate standard errors
se1, se2 = sem(data1), sem(data2)
我们可以使用样本的标准误差来计算样本之间差异的“_ 标准误差”:_
# standard error on the difference between the samples
sed = sqrt(se1**2.0 + se2**2.0)
我们现在可以计算 t 统计量:
# calculate the t statistic
t_stat = (mean1 - mean2) / sed
我们还可以计算一些其他值来帮助解释和呈现统计量。
测试的自由度数计算为两个样本中观察值的总和减去 2。
# degrees of freedom
df = n1 + n2 - 2
对于给定的显着性水平,可以使用百分点函数(PPF)计算临界值,例如 0.05(95%置信度)。
此功能可用于 SciPy 中的 t 分发,如下所示:
# calculate the critical value
alpha = 0.05
cv = t.ppf(1.0 - alpha, df)
可以使用 t 分布上的累积分布函数来计算 p 值,再次在 SciPy 中。
# calculate the p-value
p = (1 - t.cdf(abs(t_stat), df)) * 2
在这里,我们假设一个双尾分布,其中零假设的拒绝可以解释为第一个均值小于或大于第二个均值。
我们可以将所有这些部分组合成一个简单的函数来计算两个独立样本的 t 检验:
# function for calculating the t-test for two independent samples
def independent_ttest(data1, data2, alpha):
# calculate means
mean1, mean2 = mean(data1), mean(data2)
# calculate standard errors
se1, se2 = sem(data1), sem(data2)
# standard error on the difference between the samples
sed = sqrt(se1**2.0 + se2**2.0)
# calculate the t statistic
t_stat = (mean1 - mean2) / sed
# degrees of freedom
df = len(data1) + len(data2) - 2
# calculate the critical value
cv = t.ppf(1.0 - alpha, df)
# calculate the p-value
p = (1.0 - t.cdf(abs(t_stat), df)) * 2.0
# return everything
return t_stat, df, cv, p
工作示例
在本节中,我们将计算一些合成数据样本的 t 检验。
首先,让我们生成两个 100 高斯随机数的样本,其方差相同,分别为 50 和 51。我们期望测试拒绝原假设并找出样本之间的显着差异:
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
我们可以使用内置的 SciPy 函数 ttest_ind() 计算这些样本的 t 检验。这将为我们提供 t 统计值和要比较的 p 值,以确保我们正确地实现了测试。
下面列出了完整的示例。
# Student's t-test for independent samples
from numpy.random import seed
from numpy.random import randn
from scipy.stats import ttest_ind
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# compare samples
stat, p = ttest_ind(data1, data2)
print('t=%.3f, p=%.3f' % (stat, p))
运行该示例,我们可以看到 t 统计值和 p 值。
我们将使用这些作为我们对这些数据进行测试的预期值。
t=-2.262, p=0.025
我们现在可以使用上一节中定义的函数对相同的数据应用我们自己的实现。
该函数将返回 t 统计值和临界值。我们可以使用临界值来解释 t 统计量,以查看测试的结果是否显着,并且确实手段与我们预期的不同。
# interpret via critical value
if abs(t_stat) <= cv:
print('Accept null hypothesis that the means are equal.')
else:
print('Reject the null hypothesis that the means are equal.')
该函数还返回 p 值。我们可以使用α来解释 p 值,例如 0.05,以确定测试的结果是否显着,并且确实手段与我们预期的不同。
# interpret via p-value
if p > alpha:
print('Accept null hypothesis that the means are equal.')
else:
print('Reject the null hypothesis that the means are equal.')
我们希望这两种解释始终匹配。
The complete example is listed below.
# t-test for independent samples
from math import sqrt
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from scipy.stats import sem
from scipy.stats import t
# function for calculating the t-test for two independent samples
def independent_ttest(data1, data2, alpha):
# calculate means
mean1, mean2 = mean(data1), mean(data2)
# calculate standard errors
se1, se2 = sem(data1), sem(data2)
# standard error on the difference between the samples
sed = sqrt(se1**2.0 + se2**2.0)
# calculate the t statistic
t_stat = (mean1 - mean2) / sed
# degrees of freedom
df = len(data1) + len(data2) - 2
# calculate the critical value
cv = t.ppf(1.0 - alpha, df)
# calculate the p-value
p = (1.0 - t.cdf(abs(t_stat), df)) * 2.0
# return everything
return t_stat, df, cv, p
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# calculate the t test
alpha = 0.05
t_stat, df, cv, p = independent_ttest(data1, data2, alpha)
print('t=%.3f, df=%d, cv=%.3f, p=%.3f' % (t_stat, df, cv, p))
# interpret via critical value
if abs(t_stat) <= cv:
print('Accept null hypothesis that the means are equal.')
else:
print('Reject the null hypothesis that the means are equal.')
# interpret via p-value
if p > alpha:
print('Accept null hypothesis that the means are equal.')
else:
print('Reject the null hypothesis that the means are equal.')
首先运行该示例计算测试。
打印测试结果,包括 t 统计量,自由度,临界值和 p 值。
我们可以看到 t 统计量和 p 值都与 SciPy 函数的输出相匹配。测试似乎正确实现。
然后使用 t 统计量和 p 值来解释测试结果。我们发现,正如我们所期望的那样,有足够的证据可以拒绝零假设,发现样本均值可能不同。
t=-2.262, df=198, cv=1.653, p=0.025
Reject the null hypothesis that the means are equal.
Reject the null hypothesis that the means are equal.
学生对依赖样本的 t 检验
我们现在可以看一下计算依赖样本的 T 检验的情况。
在这种情况下,我们收集来自种群的样本的一些观察结果,然后应用一些处理,然后从同一样本收集观察结果。
结果是两个相同大小的样本,其中每个样本中的观察结果是相关的或配对的。
依赖样本的 t 检验称为配对 T 检验。
Calculation
配对 T 检验的计算与独立样本的情况类似。
主要区别在于分母的计算。
t = (mean(X1) - mean(X2)) / sed
WhereX1andX2are the first and second data samples andsedis the standard error of the difference between the means.
这里,sed计算如下:
sed = sd / sqrt(n)
其中sd是依赖样本平均值与 _ 之间的差异的标准偏差 n_ 是配对观察的总数(例如每个样本的大小)。
sd的计算首先需要计算样本之间的平方差之和:
d1 = sum (X1[i] - X2[i])² for i in n
它还需要样本之间(非平方)差异的总和:
d2 = sum (X1[i] - X2[i]) for i in n
然后我们可以将 sd 计算为:
sd = sqrt((d1 - (d2**2 / n)) / (n - 1))
而已。
Implementation
我们可以直接在 Python 中实现配对 Student's t-test 的计算。
第一步是计算每个样本的平均值。
# calculate means
mean1, mean2 = mean(data1), mean(data2)
接下来,我们将需要对的数量(n)。我们将在几个不同的计算中使用它。
# number of paired samples
n = len(data1)
接下来,我们必须计算样本之间的平方差的总和,以及总和差异。
# sum squared difference between observations
d1 = sum([(data1[i]-data2[i])**2 for i in range(n)])
# sum difference between observations
d2 = sum([data1[i]-data2[i] for i in range(n)])
我们现在可以计算平均值之差的标准差。
# standard deviation of the difference between means
sd = sqrt((d1 - (d2**2 / n)) / (n - 1))
然后用它来计算平均值之间差异的标准误差。
# standard error of the difference between the means
sed = sd / sqrt(n)
最后,我们拥有计算 t 统计量所需的一切。
# calculate the t statistic
t_stat = (mean1 - mean2) / sed
此实现与独立样本实现之间唯一的其他关键区别是计算自由度的数量。
# degrees of freedom
df = n - 1
和以前一样,我们可以将所有这些结合在一起成为可重用的功能。该函数将采用两个配对样本和显着性水平(alpha)并计算 t 统计量,自由度数,临界值和 p 值。
完整的功能如下所列。
# function for calculating the t-test for two dependent samples
def dependent_ttest(data1, data2, alpha):
# calculate means
mean1, mean2 = mean(data1), mean(data2)
# number of paired samples
n = len(data1)
# sum squared difference between observations
d1 = sum([(data1[i]-data2[i])**2 for i in range(n)])
# sum difference between observations
d2 = sum([data1[i]-data2[i] for i in range(n)])
# standard deviation of the difference between means
sd = sqrt((d1 - (d2**2 / n)) / (n - 1))
# standard error of the difference between the means
sed = sd / sqrt(n)
# calculate the t statistic
t_stat = (mean1 - mean2) / sed
# degrees of freedom
df = n - 1
# calculate the critical value
cv = t.ppf(1.0 - alpha, df)
# calculate the p-value
p = (1.0 - t.cdf(abs(t_stat), df)) * 2.0
# return everything
return t_stat, df, cv, p
Worked Example
在本节中,我们将在工作示例中使用与独立 Student's t 检验相同的数据集。
数据样本没有配对,但我们会假装它们。我们希望测试拒绝原假设并找出样本之间的显着差异。
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
和以前一样,我们可以使用 SciPy 函数评估测试问题,以计算配对 t 检验。在这种情况下, ttest_rel() 功能。
The complete example is listed below.
# Paired Student's t-test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import ttest_rel
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# compare samples
stat, p = ttest_rel(data1, data2)
print('Statistics=%.3f, p=%.3f' % (stat, p))
运行该示例计算并打印 t 统计量和 p 值。
我们将使用这些值来验证我们自己的配对 t 检验函数的计算。
Statistics=-2.372, p=0.020
我们现在可以测试我们自己的配对 T 检验的实现。
下面列出了完整的示例,包括已开发的函数和函数结果的解释。
# t-test for dependent samples
from math import sqrt
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from scipy.stats import t
# function for calculating the t-test for two dependent samples
def dependent_ttest(data1, data2, alpha):
# calculate means
mean1, mean2 = mean(data1), mean(data2)
# number of paired samples
n = len(data1)
# sum squared difference between observations
d1 = sum([(data1[i]-data2[i])**2 for i in range(n)])
# sum difference between observations
d2 = sum([data1[i]-data2[i] for i in range(n)])
# standard deviation of the difference between means
sd = sqrt((d1 - (d2**2 / n)) / (n - 1))
# standard error of the difference between the means
sed = sd / sqrt(n)
# calculate the t statistic
t_stat = (mean1 - mean2) / sed
# degrees of freedom
df = n - 1
# calculate the critical value
cv = t.ppf(1.0 - alpha, df)
# calculate the p-value
p = (1.0 - t.cdf(abs(t_stat), df)) * 2.0
# return everything
return t_stat, df, cv, p
# seed the random number generator
seed(1)
# generate two independent samples (pretend they are dependent)
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# calculate the t test
alpha = 0.05
t_stat, df, cv, p = dependent_ttest(data1, data2, alpha)
print('t=%.3f, df=%d, cv=%.3f, p=%.3f' % (t_stat, df, cv, p))
# interpret via critical value
if abs(t_stat) <= cv:
print('Accept null hypothesis that the means are equal.')
else:
print('Reject the null hypothesis that the means are equal.')
# interpret via p-value
if p > alpha:
print('Accept null hypothesis that the means are equal.')
else:
print('Reject the null hypothesis that the means are equal.')
运行该示例计算样本问题的配对 t 检验。
计算出的 t 统计量和 p 值与我们对 SciPy 库实现的期望相匹配。这表明实现是正确的。
具有临界值的 t 检验统计量和具有显着性水平的 p 值的解释都发现了显着的结果,拒绝了平均值相等的零假设。
t=-2.372, df=99, cv=1.660, p=0.020
Reject the null hypothesis that the means are equal.
Reject the null hypothesis that the means are equal.
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 将每个测试应用于您自己设计的样本问题。
- 更新独立测试并为具有不同方差和样本大小的样本添加校正。
- 对 SciPy 库中实现的其中一个测试执行代码审查,并总结实现细节的差异。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
图书
- 普通英语统计,第三版,2010 年。
API
用品
摘要
在本教程中,您了解了如何在 Python 中从零开始实现 Student's t 检验统计假设检验。
具体来说,你学到了:
- 学生的 t 检验将评论是否可能观察到两个样本,因为样本来自同一人群。
- 如何从零开始实现 T 检验两个独立样本。
- 如何从零开始对两个相关样本实现配对 T 检验。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何在 Python 中生成随机数
原文:
machinelearningmastery.com/how-to-generate-random-numbers-in-python/
随机性的使用是机器学习算法的配置和评估的重要部分。
从人工神经网络中的权重的随机初始化,到将数据分成随机训练和测试集,到随机梯度下降中的训练数据集的随机改组,生成随机数和利用随机性是必需的技能。
在本教程中,您将了解如何在 Python 中生成和使用随机数。
完成本教程后,您将了解:
- 可以通过使用伪随机数生成器在程序中应用该随机性。
- 如何通过 Python 标准库生成随机数并使用随机性。
- 如何通过 NumPy 库生成随机数组。
让我们开始吧。
如何在 Python 中生成随机数 照片来自 Harold Litwiler ,保留一些权利。
教程概述
本教程分为 3 个部分;他们是:
- 伪随机数生成器
- Python 的随机数
- NumPy 的随机数
1.伪随机数发生器
我们注入到我们的程序和算法中的随机性的来源是一种称为伪随机数生成器的数学技巧。
随机数生成器是从真实的随机源生成随机数的系统。经常是物理的东西,比如盖革计数器,结果变成随机数。我们在机器学习中不需要真正的随机性。相反,我们可以使用伪随机性。伪随机性是看起来接近随机的数字样本,但是使用确定性过程生成。
随机值改组数据和初始化系数使用伪随机数生成器。这些小程序通常是一个可以调用的函数,它将返回一个随机数。再次调用,他们将返回一个新的随机数。包装函数通常也可用,允许您将随机性作为整数,浮点,特定分布,特定范围内等等。
数字按顺序生成。序列是确定性的,并以初始数字播种。如果您没有显式地为伪随机数生成器设定种子,那么它可以使用当前系统时间(以秒或毫秒为单位)作为种子。
种子的价值无关紧要。选择你想要的任何东西重要的是,该过程的相同种子将导致相同的随机数序列。
让我们通过一些例子来具体化。
2.使用 Python 的随机数
Python 标准库提供了一个名为 random 的模块,它提供了一组用于生成随机数的函数。
Python 使用一种流行且强大的伪随机数生成器,称为 Mersenne Twister 。
在本节中,我们将介绍使用标准 Python API 生成和使用随机数和随机性的一些用例。
种子随机数发生器
伪随机数发生器是一种生成几乎随机数序列的数学函数。
它需要一个参数来启动序列,称为种子。该函数是确定性的,意味着给定相同的种子,它每次都会产生相同的数字序列。种子的选择无关紧要。
seed() 函数将为伪随机数生成器播种,将整数值作为参数,例如 1 或 7.如果在使用 randomness 之前未调用 seed()函数,则默认为使用 epoch(1970)中的当前系统时间(以毫秒为单位)。
下面的示例演示了对伪随机数生成器进行播种,生成一些随机数,并显示重新生成生成器将导致生成相同的数字序列。
# seed the pseudorandom number generator
from random import seed
from random import random
# seed random number generator
seed(1)
# generate some random numbers
print(random(), random(), random())
# reset the seed
seed(1)
# generate some random numbers
print(random(), random(), random())
运行示例为伪随机数生成器播种值为 1,生成 3 个随机数,重新生成生成器,并显示生成相同的三个随机数。
0.13436424411240122 0.8474337369372327 0.763774618976614
0.13436424411240122 0.8474337369372327 0.763774618976614
通过设置种子来控制随机性可能很有用,以确保您的代码每次都产生相同的结果,例如在生产模型中。
对于运行实验,其中使用随机化来控制混杂变量,可以对每个实验运行使用不同的种子。
随机浮点值
可以使用 random() 函数生成随机浮点值。值将在 0 和 1 之间的范围内生成,特别是在区间[0,1)中。
值来自均匀分布,意味着每个值具有相同的绘制机会。
以下示例生成 10 个随机浮点值。
# generate random floating point values
from random import seed
from random import random
# seed random number generator
seed(1)
# generate random numbers between 0-1
for _ in range(10):
value = random()
print(value)
运行该示例会生成并打印每个随机浮点值。
0.13436424411240122
0.8474337369372327
0.763774618976614
0.2550690257394217
0.49543508709194095
0.4494910647887381
0.651592972722763
0.7887233511355132
0.0938595867742349
0.02834747652200631
浮点值可以通过将它们乘以新范围的大小并添加最小值来重缩放到所需范围,如下所示:
scaled value = min + (value * (max - min))
其中min和max分别是所需范围的最小值和最大值,_ 值 _ 是 0 到 1 范围内随机生成的浮点值。
随机整数值
可以使用 randint() 函数生成随机整数值。
此函数有两个参数:生成的整数值的范围的开始和结束。随机整数在范围值的开始和结束范围内生成,包括范围值的开始和结束,特别是在区间[start,end]中。随机值来自均匀分布。
下面的示例生成 10 个 10 到 10 之间的随机整数值。
# generate random integer values
from random import seed
from random import randint
# seed random number generator
seed(1)
# generate some integers
for _ in range(10):
value = randint(0, 10)
print(value)
运行该示例会生成并打印 10 个随机整数值。
2
9
1
4
1
7
7
7
10
6
随机高斯值
可以使用 gauss() 函数从高斯分布中绘制随机浮点值。
此函数采用两个参数,这些参数对应于控制分布大小的参数,特别是平均值和标准偏差。
下面的示例生成从高斯分布绘制的 10 个随机值,平均值为 0.0,标准差为 1.0。
请注意,这些参数不是值的界限,并且值的扩展将由分布的钟形控制,在这种情况下,比例可能高于和低于 0.0。
# generate random Gaussian values
from random import seed
from random import gauss
# seed random number generator
seed(1)
# generate some Gaussian values
for _ in range(10):
value = gauss(0, 1)
print(value)
运行该示例生成并打印 10 个高斯随机值。
1.2881847531554629
1.449445608699771
0.06633580893826191
-0.7645436509716318
-1.0921732151041414
0.03133451683171687
-1.022103170010873
-1.4368294451025299
0.19931197648375384
0.13337460465860485
从列表中随机选择
随机数可用于从列表中随机选择项目。
例如,如果列表有 10 个索引在 0 到 9 之间的项目,那么您可以生成 0 到 9 之间的随机整数,并使用它从列表中随机选择一个项目。 choice() 函数为您实现此行为。选择是以均匀的可能性进行的。
下面的示例生成一个包含 20 个整数的列表,并给出了从列表中选择一个随机项的五个示例。
# choose a random element from a list
from random import seed
from random import choice
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# make choices from the sequence
for _ in range(5):
selection = choice(sequence)
print(selection)
首先运行该示例打印整数值列表,然后是从列表中选择和打印随机值的五个示例。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
4
18
2
8
3
列表中的随机子样本
我们可能有兴趣重复从列表中随机选择项目以创建随机选择的子集。
重要的是,一旦从列表中选择了一个项目并将其添加到子集中,就不应再次添加它。这被称为无需替换的选择,因为一旦为子集选择了列表中的项目,它就不会被添加回原始列表(即,不能用于重新选择)。
sample() 函数提供了此行为,该函数从列表中选择随机样本而不进行替换。该函数将列表和子集的大小选为参数。请注意,项目实际上并未从原始列表中删除,只能选择列表的副本。
下面的示例演示如何从 20 个整数的列表中选择五个项目的子集。
# select a random sample without replacement
from random import seed
from random import sample
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# select a subset without replacement
subset = sample(sequence, 5)
print(subset)
首先运行该示例打印整数值列表,然后选择并打印随机样本以进行比较。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[4, 18, 2, 8, 3]
随机随机播放列表
随机性可用于随机播放项目列表,例如洗牌一副牌。
shuffle() 函数可用于混洗列表。 shuffle 在适当的位置执行,这意味着作为 shuffle() 函数的参数提供的列表被混洗,而不是正在制作和返回的列表的混洗副本。
下面的示例演示了随机填充整数值列表。
# randomly shuffle a sequence
from random import seed
from random import shuffle
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# randomly shuffle the sequence
shuffle(sequence)
print(sequence)
运行该示例首先打印整数列表,然后打印随机洗牌后的相同列表。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[11, 5, 17, 19, 9, 0, 16, 1, 15, 6, 10, 13, 14, 12, 7, 3, 8, 2, 18, 4]
3. NumPy 的随机数
在机器学习中,您可能正在使用诸如 scikit-learn 和 Keras 之类的库。
这些库使用了 NumPy,这个库可以非常有效地处理数字的向量和矩阵。
NumPy 还有自己的伪随机数生成器和便捷包装函数的实现。
NumPy 还实现了 Mersenne Twister 伪随机数生成器。
让我们看几个生成随机数并使用 NumPy 数组随机性的例子。
Seed The Random Number Generator
NumPy 伪随机数生成器与 Python 标准库伪随机数生成器不同。
重要的是,播种 Python 伪随机数生成器不会影响 NumPy 伪随机数生成器。它必须单独播种和使用。
seed() 函数可用于为 NumPy 伪随机数生成器播种,取整数作为种子值。
下面的示例演示了如何为生成器设定种子以及如何重新生成生成器将导致生成相同的随机数序列。
# seed the pseudorandom number generator
from numpy.random import seed
from numpy.random import rand
# seed random number generator
seed(1)
# generate some random numbers
print(rand(3))
# reset the seed
seed(1)
# generate some random numbers
print(rand(3))
运行示例种子伪随机数生成器,打印一系列随机数,然后重新生成生成器,显示生成完全相同的随机数序列。
[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[4.17022005e-01 7.20324493e-01 1.14374817e-04]
随机浮点值数组
可以使用rand()NumPy 函数生成随机浮点值数组。
如果未提供参数,则创建单个随机值,否则可以指定数组的大小。
下面的示例创建一个由均匀分布绘制的 10 个随机浮点值的数组。
# generate random floating point values
from numpy.random import seed
from numpy.random import rand
# seed random number generator
seed(1)
# generate random numbers between 0-1
values = rand(10)
print(values)
运行该示例生成并打印随机浮点值的 NumPy 数组。
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01
1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01
3.96767474e-01 5.38816734e-01]
随机整数值数组
可以使用randint()NumPy 函数生成随机整数数组。
此函数有三个参数,范围的下限,范围的上端,以及要生成的整数值的数量或数组的大小。随机整数将从均匀分布中提取,包括较低的值并排除较高的值,例如,在区间[下,上)。
下面的示例演示了如何生成随机整数数组。
# generate random integer values
from numpy.random import seed
from numpy.random import randint
# seed random number generator
seed(1)
# generate some integers
values = randint(0, 10, 20)
print(values)
运行该示例将生成并打印一个包含 0 到 10 之间的 20 个随机整数值的数组。
[5 8 9 5 0 0 1 7 6 9 2 4 5 2 4 2 4 7 7 9]
随机高斯值数组
可以使用randn()NumPy 函数生成随机高斯值的数组。
此函数使用单个参数来指定结果数组的大小。高斯值是从标准高斯分布中提取的;这是一个平均值为 0.0 且标准差为 1.0 的分布。
下面的示例显示了如何生成随机高斯值数组。
# generate random Gaussian values
from numpy.random import seed
from numpy.random import randn
# seed random number generator
seed(1)
# generate some Gaussian values
values = randn(10)
print(values)
运行该示例生成并打印来自标准高斯分布的 10 个随机值的数组。
[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763 -2.3015387
1.74481176 -0.7612069 0.3190391 -0.24937038]
来自标准高斯分布的值可以通过将该值乘以标准偏差并且从期望的缩放分布中添加平均值来缩放。例如:
scaled value = mean + value * stdev
其中 _ 表示 _ 和stdev是所需缩放高斯分布的平均值和标准偏差,_ 值 _ 是来自标准高斯分布的随机生成值。
Shuffle NumPy 数组
NumPy 数组可以使用shuffle()NumPy 函数随机混洗。
下面的示例演示了如何随机播放 NumPy 数组。
# randomly shuffle a sequence
from numpy.random import seed
from numpy.random import shuffle
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# randomly shuffle the sequence
shuffle(sequence)
print(sequence)
首先运行该示例生成一个包含 20 个整数值的列表,然后随机播放并打印混洗数组。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[3, 16, 6, 10, 2, 14, 4, 17, 7, 1, 13, 0, 19, 18, 9, 15, 8, 12, 11, 5]
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
摘要
在本教程中,您了解了如何在 Python 中生成和使用随机数。
具体来说,你学到了:
- 可以通过使用伪随机数生成器在程序中应用该随机性。
- 如何通过 Python 标准库生成随机数并使用随机性。
- 如何通过 NumPy 库生成随机数组。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何转换数据来更好地拟合正态分布
原文:
machinelearningmastery.com/how-to-transform-data-to-fit-the-normal-distribution/
统计领域的很大一部分涉及假设高斯分布的方法:熟悉的钟形曲线。
如果您的数据具有高斯分布,则参数方法功能强大且易于理解。如果可能的话,这会激励他们使用它们。即使您的数据没有高斯分布。
您的数据可能看起来不是高斯数据或未通过正态测试,但可以进行转换以使其适合高斯分布。如果您熟悉生成观察的过程并且您认为它是高斯过程,或者除了一些失真之外,分布看起来几乎是高斯分布,这种情况更有可能发生。
在本教程中,您将了解高斯分布可能失真的原因以及可用于使数据样本更正常的技术。
完成本教程后,您将了解:
- 如何考虑样本的大小以及大数定律是否有助于改善样本的分布。
- 如何识别和删除分布中的极值和长尾。
- 功率变换和 Box-Cox 变换可用于控制二次或指数分布。
让我们开始吧。
如何将数据转换为更好的拟合正态分布 照片由 duncan_idaho_2007 ,保留一些权利。
教程概述
本教程分为 7 个部分;他们是:
- 高斯和高斯相似
- 样本量
- 数据解析
- 极端值
- 长尾巴
- 电力变革
- 无论如何使用
高斯和高斯相似
在某些情况下,您可能正在使用非高斯分布,但希望使用参数统计方法而不是非参数方法。
例如,您可能有一个具有熟悉钟形的数据样本,这意味着它看起来像高斯,但它无法进行一个或多个统计正态性测试。这表明数据可能是类似高斯的。在这种情况下,您更愿意使用参数统计,因为它具有更好的统计功效,并且因为数据显然是高斯的,或者可能是在正确的数据转换之后。
数据集在技术上可能不是高斯的原因有很多。在这篇文章中,我们将介绍一些简单的技术,您可以使用这些技术将具有高斯分布的数据样本转换为高斯分布。
这个过程没有灵丹妙药;可能需要一些实验和判断。
样本量
数据样本是非高斯的一个常见原因是因为数据样本的大小太小。
在数据稀缺的情况下开发了许多统计方法。因此,最低限度。许多方法的样本数量可能低至 20 或 30 个观测值。
然而,考虑到数据中的噪声,您可能看不到熟悉的钟形或使用适度数量的样本(例如 50 或 100)的失败正态性测试。如果是这种情况,也许您可以收集更多数据。由于大数定律,您收集的数据越多,您的数据就越有可能用于描述潜在的人口分布。
为了使这个具体,下面是从高斯分布中抽取的 50 个观测值的小样本的图的示例,其中平均值为 100,标准偏差为 50。
# histogram plot of a small sample
from numpy.random import seed
from numpy.random import randn
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate a univariate data sample
data = 50 * randn(50) + 100
# histogram
pyplot.hist(data)
pyplot.show()
运行该示例会创建数据的直方图,显示没有明确的高斯分布,甚至不是高斯分布。
极小数据样本的直方图
将样本的大小从 50 增加到 100 可以帮助更好地暴露数据分布的高斯形状。
# histogram plot of a small sample
from numpy.random import seed
from numpy.random import randn
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate a univariate data sample
data = 50 * randn(100) + 100
# histogram
pyplot.hist(data)
pyplot.show()
运行该示例,我们可以更好地看到将通过统计测试和眼球检查的数据的高斯分布。
大数据样本的直方图
数据解析
也许您期望从数据中得到高斯分布,但无论您收集的样本大小如何,它都不会实现。
这种情况的常见原因是您用于收集观察结果的分辨率。数据的分布可能被所选择的数据分辨率或观察的保真度所模糊。在建模之前修改数据分辨率的原因可能有很多,例如:
- 进行观察的机制的配置。
- 数据正在通过质量控制过程。
- 用于存储数据的数据库的分辨率。
为了使这个具体,我们可以制作 100 个随机高斯数的样本,其均值为 0,标准差为 1,并删除所有小数位。
# histogram plot of a low res sample
from numpy.random import seed
from numpy.random import randn
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate a univariate data sample
data = randn(100)
# remove decimal component
data = data.round(0)
# histogram
pyplot.hist(data)
pyplot.show()
运行该示例会产生一个看似离散的分布,尽管类似于高斯分布。将分辨率添加回观察结果将导致更全面的数据分布。
低分辨率数据样本的直方图
极端值
数据样本可能具有高斯分布,但可能由于多种原因而失真。
一个常见的原因是在分布的边缘存在极值。极端值可能存在的原因有很多,例如:
- 测量误差。
- 缺失数据。
- 数据损坏。
- 罕见的事件。
在这种情况下,可以识别和移除极值,以使分布更加高斯分布。这些极端值通常被称为异常值。
这可能需要领域专业知识或与领域专家协商,以便设计识别异常值的标准,然后将其从数据样本和您或您的模型希望将来使用的所有数据样本中删除。
我们可以证明极端值破坏数据分布是多么容易。
下面的示例创建了一个数据样本,其中 100 个随机高斯数字被缩放为平均值为 10,标准差为 5.然后,另外 10 个零值观测值被添加到分布中。如果将缺失值或损坏值分配为零值,则会发生这种情况。这是公开可用的机器学习数据集中的常见行为;例如。
# histogram plot of data with outliers
from numpy.random import seed
from numpy.random import randn
from numpy import zeros
from numpy import append
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate a univariate data sample
data = 5 * randn(100) + 10
# add extreme values
data = append(data, zeros(10))
# histogram
pyplot.hist(data)
pyplot.show()
运行该示例将创建并绘制数据样本。您可以清楚地看到零值观测的意外高频率如何破坏分布。
具有极值的数据样本的直方图
长尾巴
极端值可以以多种方式表现出来。除了分布边缘的大量罕见事件之外,您可能会在一个或两个方向上看到分布的长尾。
在图中,这可以使分布看起来像是指数的,而实际上它可能是高斯的,在一个方向上有大量罕见事件。
您可以使用简单的阈值(可能基于与平均值的标准偏差的数量)来识别和移除长尾值。
我们可以用一个人为的例子来证明这一点。数据样本包含 100 个高斯随机数,平均值为 10,标准差为 5.另外 50 个均匀随机值在 10 到 110 的范围内。这会在分布上产生长尾。
# histogram plot of data with a long tail
from numpy.random import seed
from numpy.random import randn
from numpy.random import rand
from numpy import append
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate a univariate data sample
data = 5 * randn(100) + 10
tail = 10 + (rand(50) * 100)
# add long tail
data = append(data, tail)
# histogram
pyplot.hist(data)
pyplot.show()
运行该示例,您可以看到长尾如何扭曲高斯分布并使其看起来几乎呈指数或甚至双峰(两个凸起)。
长尾数据样本的直方图
我们可以在此数据集上使用一个简单的阈值(例如值 25)作为截止值,并删除高于此阈值的所有观测值。我们确实在事先了解数据样本是如何设计的情况下选择了此阈值,但您可以设想在自己的数据集上测试不同的阈值并评估其效果。
# histogram plot of data with a long tail
from numpy.random import seed
from numpy.random import randn
from numpy.random import rand
from numpy import append
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate a univariate data sample
data = 5 * randn(100) + 10
tail = 10 + (rand(10) * 100)
# add long tail
data = append(data, tail)
# trim values
data = [x for x in data if x < 25]
# histogram
pyplot.hist(data)
pyplot.show()
运行代码显示了长尾的这种简单修整如何将数据返回到高斯分布。
具有截断长尾的数据样本的直方图
电力变革
数据的分布可能是正常的,但数据可能需要转换以帮助公开它。
例如,数据可能具有歪斜,这意味着钟形的钟可以以某种方式推动。在某些情况下,可以通过计算观测值的平方根来转换数据来纠正这种情况。
或者,分布可以是指数的,但如果通过取值的自然对数来转换观察值,则分布可能看起来正常。具有此分布的数据称为 log-normal。
为了使其具体化,下面是转换为具有指数分布的高斯数的样本的示例。
# log-normal distribution
from numpy.random import seed
from numpy.random import randn
from numpy import exp
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate two sets of univariate observations
data = 5 * randn(100) + 50
# transform to be exponential
data = exp(data)
# histogram
pyplot.hist(data)
pyplot.show()
运行该示例会创建一个显示指数分布的直方图。事实上,数据实际上并不正常。
对数正态分布的直方图
取平方根和观测值的对数以使分布正态属于一类称为幂变换的变换。 Box-Cox 方法是一种数据变换方法,能够执行一系列功率变换,包括日志和平方根。该方法以 George Box 和 David Cox 命名。
更重要的是,它可以配置为自动评估一组变换并选择最佳拟合。它可以被认为是一种电子工具,可以消除数据样本中基于功率的变化。得到的数据样本可能更线性,并且将更好地表示潜在的非功率分布,包括高斯分布。
boxcox()SciPy 函数实现了 Box-Cox 方法。它需要一个名为 lambda 的参数来控制要执行的变换类型。
以下是 lambda 的一些常见值:
- lambda = -1 。是一个互惠的变换。
- lambda = -0.5 是倒数平方根变换。
- lambda = 0.0 是对数变换。
- lambda = 0.5 是平方根变换。
- lambda = 1.0 没有变换。
例如,因为我们知道数据是对数正态的,所以我们可以使用 Box-Cox 通过将 lambda 显式设置为 0 来执行日志转换。
# power transform
data = boxcox(data, 0)
下面列出了对指数数据样本应用 Box-Cox 变换的完整示例。
# box-cox transform
from numpy.random import seed
from numpy.random import randn
from numpy import exp
from scipy.stats import boxcox
from matplotlib import pyplot
# seed the random number generator
seed(1)
# generate two sets of univariate observations
data = 5 * randn(100) + 100
# transform to be exponential
data = exp(data)
# power transform
data = boxcox(data, 0)
# histogram
pyplot.hist(data)
pyplot.show()
运行该示例对数据样本执行 Box-Cox 变换并绘制结果,清楚地显示高斯分布。
Box Cox 变换指数数据样本的直方图
Box-Cox 变换的局限性在于它假设数据样本中的所有值都是正数。
另一种不做出这种假设的方法是 Yeo-Johnson 变换。
无论如何使用
最后,您可能希望将数据视为高斯数据,尤其是如果数据已经是高斯数据的话。
在某些情况下,例如使用参数统计方法,这可能会导致乐观的发现。
在其他情况下,例如对输入数据产生高斯期望的机器学习方法,您仍可能看到良好的结果。
只要您意识到可能的缺点,这是您可以做出的选择。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 列出高斯分布可能被扭曲的 3 种可能的其他方式
- 开发数据样本并使用 Box-Cox 变换中的 lambda 的 5 个常用值进行实验。
- 加载机器学习数据集,其中至少一个变量具有类似高斯的分布和实验。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
帖子
API
- numpy.random.seed()API
- numpy.random.randn()API
- numpy.random.rand()API
- matplotlib.pyplot.hist()API
- scipy.stats.boxcox()API
用品
- 维基百科上的正态分布
- 维基百科上的异常值
- 维基百科上的对数正态分布
- 维基百科上的权力转换
摘要
在本教程中,您了解了高斯分布可能失真的原因以及可用于使数据样本更正常的技术。
具体来说,你学到了:
- 如何考虑样本的大小以及大数定律是否有助于改善样本的分布。
- 如何识别和删除分布中的极值和长尾。
- 功率变换和 Box-Cox 变换可用于控制二次或指数分布。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何使用相关来理解变量之间的关系
原文:
machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/
数据集中的变量之间可能存在复杂且未知的关系。
发现和量化数据集中变量相互依赖的程度非常重要。这些知识可以帮助您更好地准备数据,以满足机器学习算法的期望,例如线性回归,其表现会因这些相互依赖性而降低。
在本教程中,您将发现相关性是变量之间关系的统计汇总,以及如何为不同类型的变量和关系计算变量。
完成本教程后,您将了解:
- 如何计算协方差矩阵以总结两个或多个变量之间的线性关系。
- 如何计算 Pearson 相关系数来总结两个变量之间的线性关系。
- 如何计算 Spearman 的相关系数来总结两个变量之间的单调关系。
让我们开始吧。
- 更新 May / 2018 :更新了协方差符号的描述(感谢 Fulya )。
如何使用相关来理解变量之间的关系 照片由 Fraser Mummery ,保留一些权利。
教程概述
本教程分为 5 个部分;他们是:
- 什么是相关性?
- 测试数据集
- 协方差
- 皮尔逊的相关性
- 斯皮尔曼的相关性
什么是相关性?
数据集中的变量可能由于许多原因而相关。
例如:
- 一个变量可能导致或依赖于另一个变量的值。
- 一个变量可以与另一个变量轻微关联。
- 两个变量可能取决于第三个未知变量。
它可用于数据分析和建模,以更好地理解变量之间的关系。两个变量之间的统计关系称为它们的相关性。
相关性可能是正的,意味着两个变量在相同的方向上移动,或者是负的,这意味着当一个变量的值增加时,其他变量的值会减少。相关也可以是神经的或零,意味着变量是不相关的。
- 正相关:两个变量在同一方向上变化。
- 中性相关:变量变化没有关系。
- 负相关:变量方向相反。
如果两个或多个变量紧密相关,某些算法的表现可能会恶化,称为多重共线性。一个例子是线性回归,其中应删除一个违规的相关变量,以提高模型的技能。
我们也可能对输入变量与输出变量之间的相关性感兴趣,以便深入了解哪些变量可能或可能不与开发模型的输入相关。
关系的结构可以是已知的,例如,它可能是线性的,或者我们可能不知道两个变量之间是否存在关系或它可能采取什么样的结构。根据关于变量的关系和分布的已知信息,可以计算不同的相关分数。
在本教程中,我们将查看具有高斯分布和线性关系的变量的一个分数,以及不假设分布的另一个分数,并将报告任何单调(增加或减少)关系。
测试数据集
在我们查看关联方法之前,让我们定义一个可用于测试方法的数据集。
我们将生成两个具有强正相关的两个变量的 1,000 个样本。第一个变量是从高斯分布中抽取的随机数,平均值为 100,标准差为 20.第二个变量是来自第一个变量的值,高斯噪声加上平均值为 50,标准差为 10 。
我们将使用 randn() 函数生成平均值为 0 且标准差为 1 的随机高斯值,然后将结果乘以我们自己的标准差并添加平均值以将值转换为首选范围。
伪随机数生成器被播种以确保每次运行代码时我们都得到相同的数字样本。
# generate related variables
from numpy import mean
from numpy import std
from numpy.random import randn
from numpy.random import seed
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# summarize
print('data1: mean=%.3f stdv=%.3f' % (mean(data1), std(data1)))
print('data2: mean=%.3f stdv=%.3f' % (mean(data2), std(data2)))
# plot
pyplot.scatter(data1, data2)
pyplot.show()
首先运行该示例打印每个变量的均值和标准差。
data1: mean=100.776 stdv=19.620
data2: mean=151.050 stdv=22.358
创建两个变量的散点图。因为我们设计了数据集,所以我们知道这两个变量之间存在关系。当我们检查生成的散点图时,我们可以看到增加的趋势。
测试相关数据集的散点图
在我们考虑计算一些相关性分数之前,我们首先要看一个重要的统计构建块,称为协方差。
协方差
变量可以通过线性关系相关联。这是一种在两个数据样本中始终相加的关系。
这种关系可以归结为两个变量,称为协方差。它被计算为每个样本的值之间的乘积平均值,其中值没有居中(减去它们的平均值)。
样本协方差的计算如下:
cov(X, Y) = (sum (x - mean(X)) * (y - mean(Y))) * 1/(n-1)
在计算中使用均值表明每个数据样本需要具有高斯分布或类高斯分布。
协方差的符号可以解释为两个变量是在相同方向上变化(正)还是在不同方向上变化(负)。协方差的大小不容易解释。协方差值为零表示两个变量完全独立。
cov()NumPy 函数可用于计算两个或更多个变量之间的协方差矩阵。
covariance = cov(data1, data2)
矩阵的对角线包含每个变量与其自身之间的协方差。矩阵中的其他值表示两个变量之间的协方差;在这种情况下,剩下的两个值是相同的,因为我们只计算两个变量的协方差。
我们可以在测试问题中计算两个变量的协方差矩阵。
下面列出了完整的示例。
# calculate the covariance between two variables
from numpy.random import randn
from numpy.random import seed
from numpy import cov
# seed random number generator
seed(1)
# prepare data
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# calculate covariance matrix
covariance = cov(data1, data2)
print(covariance)
协方差和协方差矩阵广泛用于统计和多变量分析,以表征两个或多个变量之间的关系。
运行该示例计算并打印协方差矩阵。
因为数据集是根据从高斯分布绘制的每个变量而设计的,并且变量是线性相关的,所以协方差是描述关系的合理方法。
两个变量之间的协方差为 389.75。我们可以看到它是积极的,表明变量的变化方向与我们预期的相同。
[[385.33297729 389.7545618 ]
[389.7545618 500.38006058]]
作为统计工具的协方差问题在于解释具有挑战性。这导致我们接下来的 Pearson 相关系数。
皮尔逊的相关性
Pearson 相关系数(以 Karl Pearson 命名)可用于总结两个数据样本之间的线性关系的强度。
Pearson 相关系数计算为两个变量的协方差除以每个数据样本的标准差的乘积。这是两个变量之间协方差的归一化,以给出可解释的分数。
Pearson's correlation coefficient = covariance(X, Y) / (stdv(X) * stdv(Y))
在计算中使用均值和标准偏差表明需要两个数据样本具有高斯分布或类高斯分布。
计算结果,相关系数可以解释为理解关系。
系数返回介于-1 和 1 之间的值,表示从完全负相关到完全正相关的相关限制。值 0 表示没有相关性。必须解释该值,其中低于-0.5 或高于 0.5 的值通常表示显着的相关性,低于这些值的值表明相关性较不显着。
pearsonr()SciPy 函数可用于计算具有相同长度的两个数据样本之间的 Pearson 相关系数。
我们可以计算出测试问题中两个变量之间的相关性。
The complete example is listed below.
# calculate the Pearson's correlation between two variables
from numpy.random import randn
from numpy.random import seed
from scipy.stats import pearsonr
# seed random number generator
seed(1)
# prepare data
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# calculate Pearson's correlation
corr, _ = pearsonr(data1, data2)
print('Pearsons correlation: %.3f' % corr)
运行该示例计算并打印 Pearson 的相关系数。
我们可以看到这两个变量是正相关的,相关系数是 0.8。这表明高水平的相关性,例如值大于 0.5 且接近 1.0。
Pearsons correlation: 0.888
Pearson 相关系数可用于评估两个以上变量之间的关系。
这可以通过计算数据集中每对变量之间的关系矩阵来完成。结果是一个称为相关矩阵的对称矩阵,沿对角线的值为 1.0,因为每列总是与自身完全相关。
斯皮尔曼的相关性
两个变量可能通过非线性关系相关,使得变量分布中的关系更强或更弱。
此外,所考虑的两个变量可以具有非高斯分布。
在这种情况下,Spearman 的相关系数(以 Charles Spearman 命名)可用于总结两个数据样本之间的强度。如果变量之间存在线性关系,也可以使用这种关系测试,但功率稍低(例如,可能导致系数得分较低)。
与 Pearson 相关系数一样,对于完全负相关的变量,得分在-1 和 1 之间,并且分别完全正相关。
不是使用样本本身的协方差和标准偏差来计算系数,而是根据每个样本的值的相对等级计算这些统计量。这是非参数统计中常用的方法,例如统计方法,我们不假设数据的分布,如高斯。
Spearman's correlation coefficient = covariance(rank(X), rank(Y)) / (stdv(rank(X)) * stdv(rank(Y)))
尽管假设了单调关系,但不假设变量之间存在线性关系。这是两个变量之间增加或减少关系的数学名称。
如果您不确定两个变量之间的分布和可能的关系,Spearman 相关系数是一个很好的工具。
spearmanr()SciPy 函数可用于计算具有相同长度的两个数据样本之间的 Spearman 相关系数。
We can calculate the correlation between the two variables in our test problem.
The complete example is listed below.
# calculate the spearmans's correlation between two variables
from numpy.random import randn
from numpy.random import seed
from scipy.stats import spearmanr
# seed random number generator
seed(1)
# prepare data
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# calculate spearman's correlation
corr, _ = spearmanr(data1, data2)
print('Spearmans correlation: %.3f' % corr)
运行该示例计算并打印 Spearman 的相关系数。
我们知道数据是高斯数,并且变量之间的关系是线性的。然而,非参数基于秩的方法显示 0.8 之间的强相关性。
Spearmans correlation: 0.872
与 Pearson 相关系数一样,可以对数据集中的每个变量成对地计算系数,以给出用于查看的相关矩阵。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 生成具有正负关系的自己的数据集,并计算两个相关系数。
- 编写函数来计算所提供数据集的 Pearson 或 Spearman 相关矩阵。
- 加载标准机器学习数据集并计算所有实值变量对之间的相关系数。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
帖子
- 对 NumPy 的期望值,方差和协方差的温和介绍
- 自相关和部分自相关的温和介绍
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
用品
摘要
在本教程中,您发现相关性是变量之间关系的统计汇总,以及如何为不同类型的变量和关系计算变量。
具体来说,你学到了:
- 如何计算协方差矩阵以总结两个或多个变量之间的线性关系。
- 如何计算 Pearson 相关系数来总结两个变量之间的线性关系。
- 如何计算 Spearman 的相关系数来总结两个变量之间的单调关系。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何使用统计量识别数据中的异常值
原文:
machinelearningmastery.com/how-to-use-statistics-to-identify-outliers-in-data/
建模时,清理数据样本以确保观察结果最能代表问题非常重要。
有时,数据集可以包含超出预期范围的极值,而不像其他数据。这些被称为异常值,通常可以通过理解甚至去除这些异常值来改进机器学习建模和模型技能。
在本教程中,您将发现有关异常值和两种统计方法的更多信息,可用于从数据集中识别和过滤异常值。
完成本教程后,您将了解:
- 异常值是数据集中不太可能的观察结果,可能有许多原因之一。
- 该标准偏差可用于识别高斯或类高斯数据中的异常值。
- 无论分布如何,四分位数范围都可用于识别数据中的异常值。
让我们开始吧。
- 更新 May / 2018 :修正了通过异常值限制过滤样本时的错误。谢谢 Yishai E 和彼得。
如何使用统计量识别数据中的异常值 照片由 Jeff Richardson 提供,保留一些权利。
教程概述
本教程分为 4 个部分;他们是:
- 什么是异常值?
- 测试数据集
- 标准偏差法
- 四分位距离法
什么是异常值?
异常值是一种与其他观察结果不同的观察结果。
它很少见,或不同,或者不适合某种方式。
异常值可能有很多原因,例如:
- 测量或输入错误。
- 数据损坏。
- 真正的离群观察(例如篮球中的迈克尔乔丹)。
由于每个数据集的具体情况,通常没有精确的方法来定义和识别异常值。相反,您或域专家必须解释原始观察并决定值是否为异常值。
尽管如此,我们可以使用统计方法来识别在可用数据的情况下看起来很少或不太可能的观察结果。
这并不意味着所识别的值是异常值,应予以删除。但是,本教程中描述的工具可以帮助您了解可能需要重新审视的罕见事件。
一个好的建议是考虑绘制已识别的离群值,也许在非离群值的背景下,以查看异常值是否存在任何系统关系或模式。如果存在,也许它们不是异常值并且可以解释,或者可能更系统地识别异常值本身。
测试数据集
在我们查看异常值识别方法之前,让我们定义一个可用于测试方法的数据集。
我们将生成从高斯分布中抽取的 10,000 个随机数,平均值为 50,标准差为 5。
从高斯分布绘制的数字将具有异常值。也就是说,凭借分布本身,将会有一些与我们可以识别为异常值的平均罕见值相距很远的值。
我们将使用 randn() 函数生成平均值为 0 且标准差为 1 的随机高斯值,然后将结果乘以我们自己的标准差并添加平均值以将值转换为首选范围。
伪随机数生成器被播种以确保每次运行代码时我们都得到相同的数字样本。
# generate gaussian data
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from numpy import std
# seed the random number generator
seed(1)
# generate univariate observations
data = 5 * randn(10000) + 50
# summarize
print('mean=%.3f stdv=%.3f' % (mean(data), std(data)))
运行该示例将生成样本,然后打印均值和标准差。正如预期的那样,这些值非常接近预期值。
mean=50.049 stdv=4.994
标准偏差法
如果我们知道样本中的值分布是高斯分布或类高斯分布,我们可以使用样本的标准偏差作为识别异常值的截止值。
高斯分布具有以下特性:可以使用与均值的标准偏差来可靠地总结样本中的值的百分比。
例如,在平均值的一个标准偏差内将覆盖 68%的数据。
因此,如果平均值为 50 且标准差为 5,如上面的测试数据集中那样,则样本中 45 到 55 之间的所有数据将占数据样本的约 68%。如果我们扩展范围如下,我们可以覆盖更多的数据样本:
- 1 标准偏差均值:68%
- 2 与标准差的标准偏差:95%
- 3 与标准差的标准偏差:99.7%
超出 3 个标准偏差的值是分布的一部分,但在 370 个样本中约有 1 个是不太可能或罕见的事件。
与平均值的三个标准偏差是在实践中用于识别高斯或高斯分布的异常值的常见截止。对于较小的数据样本,可以使用 2 个标准偏差(95%)的值,对于较大的样本,可以使用 4 个标准偏差(99.9%)的值。
让我们用一个有效的例子来具体化。
有时,首先将数据标准化(例如,以零均值和单位方差的 Z 分数),以便可以使用标准 Z 分数截止值来执行异常值检测。这是一种方便,一般不需要,我们将在此处以数据的原始比例进行计算以使事情清楚。
我们可以计算给定样本的平均值和标准差,然后计算用于识别异常值的截止值,其与平均值的偏差超过 3 个标准偏差。
# calculate summary statistics
data_mean, data_std = mean(data), std(data)
# identify outliers
cut_off = data_std * 3
lower, upper = data_mean - cut_off, data_mean + cut_off
然后我们可以将异常值识别为超出定义的下限和上限的那些示例。
# identify outliers
outliers = [x for x in data if x < lower or x > upper]
或者,我们可以从样本中过滤掉那些不在定义范围内的值。
# remove outliers
outliers_removed = [x for x in data if x > lower and x < upper]
我们可以将这一切与我们在上一节中准备的样本数据集放在一起。
下面列出了完整的示例。
# identify outliers with standard deviation
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from numpy import std
# seed the random number generator
seed(1)
# generate univariate observations
data = 5 * randn(10000) + 50
# calculate summary statistics
data_mean, data_std = mean(data), std(data)
# identify outliers
cut_off = data_std * 3
lower, upper = data_mean - cut_off, data_mean + cut_off
# identify outliers
outliers = [x for x in data if x < lower or x > upper]
print('Identified outliers: %d' % len(outliers))
# remove outliers
outliers_removed = [x for x in data if x >= lower and x <= upper]
print('Non-outlier observations: %d' % len(outliers_removed))
运行该示例将首先打印已识别的异常值的数量,然后打印不是异常值的观察数量,从而演示如何分别识别和过滤异常值。
Identified outliers: 29
Non-outlier observations: 9971
到目前为止,我们只讨论了具有高斯分布的单变量数据,例如:一个变量。如果您有多变量数据,则可以使用相同的方法,例如:具有多个变量的数据,每个变量具有不同的高斯分布。
如果你有两个变量,你可以想象在两个维度中定义椭圆的边界。落在椭圆之外的观察将被视为异常值。在三个维度中,这将是椭圆体,依此类推到更高的维度。
或者,如果您对域有更多了解,可能会通过超出数据维度的一个或一个子集的限制来识别异常值。
四分位距离法
并非所有数据都是正常的或正常的,足以将其视为从高斯分布中提取。
总结非高斯分布数据样本的一个很好的统计量是 Interquartile Range,简称 IQR。
IQR 计算为数据的第 75 百分位数和第 25 百分位数之间的差异,并在框和晶须图中定义框。
请记住,可以通过对观察值进行排序并在特定指数处选择值来计算百分位数。第 50 个百分位数是中间值,或偶数个例子的两个中间值的平均值。如果我们有 10,000 个样本,那么第 50 个百分位将是第 5000 个和第 5001 个值的平均值。
我们将百分位数称为四分位数(“_ 夸脱 _”意思是 4)因为数据通过第 25,50 和 75 位值分为四组。
IQR 定义了中间 50%的数据或数据的主体。
IQR 可用于通过定义样本值的限制来识别异常值,这些样本值是 IQR 低于第 25 百分位数或高于第 75 百分位数的因子k。因子k的共同值是值 1.5。当在盒子和须状图的背景下描述时,因子 k 为 3 或更大可用于识别极端异常值或“_ 远离 _”的值。
在盒子和须状图上,这些限制被绘制为从盒子中绘制的胡须(或线条)上的栅栏。超出这些值的值将绘制为点。
我们可以使用 _ 百分位数()_ NumPy 函数计算数据集的百分位数,该函数采用数据集和所需百分位数的规格。然后可以将 IQR 计算为第 75 百分位数和第 25 百分位数之间的差值。
# calculate interquartile range
q25, q75 = percentile(data, 25), percentile(data, 75)
iqr = q75 - q25
然后,我们可以将异常值的截止值计算为 IQR 的 1.5 倍,并从第 25 个百分位数中减去此截止值,并将其加到第 75 个百分位数,以给出数据的实际限制。
# calculate the outlier cutoff
cut_off = iqr * 1.5
lower, upper = q25 - cut_off, q75 + cut_off
然后,我们可以使用这些限制来识别异常值。
# identify outliers
outliers = [x for x in data if x < lower or x > upper]
我们还可以使用限制来过滤数据集中的异常值。
outliers_removed = [x for x in data if x > lower and x < upper]
我们可以将所有这些结合在一起并演示测试数据集上的过程。
The complete example is listed below.
# identify outliers with interquartile range
from numpy.random import seed
from numpy.random import randn
from numpy import percentile
# seed the random number generator
seed(1)
# generate univariate observations
data = 5 * randn(10000) + 50
# calculate interquartile range
q25, q75 = percentile(data, 25), percentile(data, 75)
iqr = q75 - q25
print('Percentiles: 25th=%.3f, 75th=%.3f, IQR=%.3f' % (q25, q75, iqr))
# calculate the outlier cutoff
cut_off = iqr * 1.5
lower, upper = q25 - cut_off, q75 + cut_off
# identify outliers
outliers = [x for x in data if x < lower or x > upper]
print('Identified outliers: %d' % len(outliers))
# remove outliers
outliers_removed = [x for x in data if x >= lower and x <= upper]
print('Non-outlier observations: %d' % len(outliers_removed))
首先运行该示例打印已识别的第 25 和第 75 百分位数以及计算的 IQR。打印所识别的异常值的数量,然后是非异常值观察的数量。
Percentiles: 25th=46.685, 75th=53.359, IQR=6.674
Identified outliers: 81
Non-outlier observations: 9919
通过依次计算数据集中每个变量的限制,并将异常值作为落在矩形或超矩形之外的观察值,可以将该方法用于多变量数据。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 开发自己的高斯测试数据集并在直方图上绘制异常值和非异常值。
- 在使用非高斯分布生成的单变量数据集上测试基于 IQR 的方法。
- 选择一种方法并创建一个函数,该函数将过滤掉具有任意维数的给定数据集的异常值。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
帖子
API
用品
摘要
在本教程中,您发现了异常值和两种统计方法,可用于从数据集中识别和过滤异常值。
具体来说,你学到了:
- 异常值是数据集中不太可能的观察结果,可能有许多原因之一。
- 该标准偏差可用于识别高斯或类高斯数据中的异常值。
- 无论分布如何,四分位数范围都可用于识别数据中的异常值。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。