统计学和统计方法领域有很大一部分致力于数据分布已知的情况。
我们已经知道其分布或可以轻松识别其分布的数据样本称为参数数据。在常用用法中,参数通常指来自高斯分布的数据。分布未知或难以识别的数据称为非参数数据。
如果您正在处理非参数数据,可以使用专门的非参数统计方法,这些方法会丢弃所有关于分布的信息。因此,这些方法通常被称为分布无关方法。
在本教程中,您将了解非参数统计及其在应用机器学习中的作用。
完成本教程后,您将了解:
- 参数数据与非参数数据之间的区别。
- 如何对数据进行排序,以便丢弃所有关于数据分布的信息。
- 可用于排序数据的统计方法示例。
开始您的项目,阅读我的新书《机器学习统计学》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

非参数统计简明介绍
照片由 Daniel Hartwig 拍摄,保留部分权利。
教程概述
本教程分为4个部分,它们是:
- 参数数据
- 非参数数据
- 数据排序
- 处理排序数据
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
参数数据
参数数据是从已知数据分布中提取的数据样本。
这意味着我们已经知道该分布或已识别出该分布,并且我们知道该分布的参数。通常,“参数”是来自高斯分布的实值数据的简称。这是一个有用的简称,但严格来说并不完全准确。
如果我们有参数数据,我们就可以使用参数方法。继续以参数数据为高斯数据的简称。如果我们有参数数据,我们可以利用所有为假设高斯分布的数据而开发的统计方法,例如
- 摘要统计。
- 变量之间的相关性。
- 用于比较均值的显著性检验。
总的来说,我们倾向于处理参数数据,甚至会进行数据准备来使数据参数化,例如数据转换,以便我们能够利用这些易于理解的统计方法。
非参数数据
不符合已知或易于理解的分布的数据称为非参数数据。
数据可能是非参数的,原因有很多,例如:
- 数据不是实值,而是序数、区间或其他形式。
- 数据是实值,但不符合易于理解的形状。
- 数据接近参数,但包含异常值、多个峰值、偏移或其他特征。
我们有用于非参数数据的方法称为非参数统计方法。事实上,大多数参数方法都有其对应的非参数版本。
总的来说,非参数方法的发现能力不如其对应的参数方法,这主要是因为它们必须进行泛化才能适用于所有类型的数据。我们仍然可以使用它们进行推断并对发现和结果做出声明,但它们不如使用参数方法进行的类似声明有说服力。有关分布的信息被丢弃了。
对于序数或区间数据,非参数统计是唯一可用的统计类型。对于实值数据,当您试图对不符合熟悉高斯分布的数据做出声明时,在应用机器学习中需要非参数统计方法。
数据排序
在应用非参数统计方法之前,必须将数据转换为排名格式。
因此,期望数据为排名格式的统计方法有时被称为排名统计,例如排名相关和排名统计假设检验。
数据排序顾名思义。过程如下:
- 按升序对样本中的所有数据进行排序。
- 为数据样本中的每个唯一值分配一个从 1 到 N 的整数排名。
例如,假设我们有以下数据样本,以列的形式呈现:
1 2 3 4 5 |
0.020 0.184 0.431 0.550 0.620 |
我们可以按以下方式对其进行排序:
1 2 3 4 5 |
0.020 0.184 0.431 0.550 0.620 |
然后为每个值分配排名,从 1 开始
1 2 3 4 5 |
1 = 0.021055 2 = 0.404622 3 = 0.488733 4 = 0.618510 5 = 0.832803 |
然后,我们可以将此过程应用于另一个数据样本,并开始使用非参数统计方法。
对于特殊情况,例如处理平局、使用反向排名和使用分数排名,此过程存在变体,但一般属性仍然适用。
SciPy 库提供了 `rankdata()` 函数来对数值数据进行排序,该函数支持多种排序变体。
下面的示例演示了如何对数值数据集进行排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from numpy.random import rand from numpy.random import seed from scipy.stats import rankdata # 设定随机数生成器种子 seed(1) # 生成数据集 data = rand(1000) # 查看前 10 个样本 print(data[:10]) # 对数据进行排序 ranked = rankdata(data) # 查看前 10 个排序样本 print(ranked[:10]) |
运行示例,首先生成一个包含 1000 个来自均匀分布的随机数样本,然后对数据样本进行排序并打印结果。
1 2 3 4 |
[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] [408. 721. 1. 300. 151. 93. 186. 342. 385. 535.] |
处理排序数据
有一些统计工具可用于检查您的样本数据是否符合给定的分布。
正态性检验
例如,如果我们采用非参数数据作为看起来不像高斯分布的数据,那么您可以使用量化样本数据有多“高斯”的统计方法,并在数据未通过这些测试时使用非参数方法。
用于正态性检验(即所谓的正态性检验)的统计方法有三个例子:
- Shapiro-Wilk 检验。
- Kolmogorov-Smirnov 检验。
- Anderson-Darling 检验
有关使用这些方法的示例,请参阅教程
一旦您决定使用非参数统计,就必须对数据进行排序。
事实上,您用于推断的大多数工具都会自动执行样本数据的排序。尽管如此,了解样本数据在执行测试之前是如何转换的很重要。
在应用机器学习中,您可能对数据有两个主要问题,这些问题可以用非参数统计方法来解决:
变量之间的关系
量化变量之间依赖性的方法称为相关性方法。
您可以使用两种非参数统计相关性方法:
- Spearman 秩相关系数。
- Kendall 秩相关系数。
有关使用这些方法的示例,请参阅教程
比较样本均值
量化两个总体均值之间是否存在显著差异的方法称为统计显著性检验。
四种可用的非参数统计显著性检验是:
- Mann-Whitney U 检验。
- Wilcoxon 符号秩检验。
- Kruskal-Wallis H 检验。
- Friedman 检验。
有关使用这些方法的示例,请参阅教程
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 列出三个您认为可能需要在应用机器学习项目中使用的非参数统计方法的示例。
- 开发您自己的示例来演示 `rankdata()` 函数的功能。
- 编写您自己的函数来对提供的单变量数据集进行排序。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
教程
书籍
API
文章
总结
在本教程中,您了解了非参数统计及其在应用机器学习中的作用。
具体来说,你学到了:
- 参数数据与非参数数据之间的区别。
- 如何对数据进行排序,以便丢弃所有关于数据分布的信息。
- 可用于排序数据的统计方法示例。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
感谢您的有益分享和宝贵资源。未来,建议提供实际案例场景的示例,例如在医疗领域用于癌症检测。
感谢您的建议。
感谢您对这个入门的清晰介绍。它让我确信,使用排序来转换环境分析中的一些 BOD:TOC 数据以开发特定站点的方程,是我为我的 NPDES 许可证所做的明智之举。
再次感谢。
我很高兴它能帮到你。
我真的不知道你在说什么。这不像我希望的那么温和的介绍。我显然需要更进一步地简化。
也许从这里开始
https://machinelearning.org.cn/start-here/#statistical_methods
我理解了一点,但对参数数据不太确定。你能举例说明一下吗?
参数数据只是意味着它符合我们已知/理解的分布,并且该分布具有我们知道会以可预测的方式影响结构的参数。
这有帮助吗?
早上好,Jason。
如果我没理解错的话,数据排序过程应该将一个包含多个浮点数列和 N 行的 DataFrame 转换为一个包含所有整数在 [1,N] 范围内的列的表。(正如你在只有一个列/变量和 1000 行的示例中所示)。
然而,我还不明白对这些排序后的列执行正态性检验的部分。因为——如果我理解得没错——排序只是保留了数字的顺序,但删除了关于分布形状的其余信息。那么任何正态性检验如何能对这样的输入起作用呢?
此致!
是的。
它们测试每个分布是否以相同的方式对示例进行排序,或者不排序。
你好,
有没有办法在 Python 中纯粹地进行 Shapiro-Wilk 检验,而无需使用 Scipy,就像您有实现 Student t 检验的文章一样?是否有任何源代码引用可用,如果您能提供链接,那就太有帮助了。
我认为您必须自己编写代码。
我没有实现,抱歉。