概率密度是观测值与其概率之间的关系。
随机变量的某些结果的概率密度较低,而其他结果的概率密度较高。
概率密度的整体形状称为概率分布,而随机变量特定结果的概率计算由概率密度函数(简称 PDF)执行。
了解数据样本的概率密度函数很有用,这样可以知道某个观测值是否不太可能出现,或者非常不可能出现以至于被视为异常值或异常情况,以及是否应该将其删除。它也有助于选择需要输入数据具有特定概率分布的学习方法。
随机数据样本的概率密度函数不太可能已知。因此,必须使用一个称为概率密度估计的过程来近似概率密度。
在本教程中,您将发现概率密度估计的入门介绍。
完成本教程后,您将了解:
- 直方图提供了一种快速可靠的方法来可视化数据样本的概率密度。
- 参数化概率密度估计涉及选择一个通用分布,并从数据样本中估计密度函数的参数。
- 非参数化概率密度估计涉及使用一种技术来拟合模型以适应数据的任意分布,例如核密度估计。
开始您的项目,阅读我的新书《机器学习中的概率》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

概率密度估计简明介绍
照片作者:Alistair Paterson,部分权利保留。
教程概述
本教程分为四个部分;它们是
- 概率密度
- 用直方图总结密度
- 参数化密度估计
- 非参数化密度估计
概率密度
随机变量 *x* 具有概率分布 *p(x)*。
随机变量的结果与其概率之间的关系被称为概率密度,或简称为“密度”。
如果随机变量是连续的,则可以通过概率密度函数(简称 PDF)计算概率。概率密度函数在随机变量的域上的形状被称为概率分布,并且常见的概率分布都有名称,例如均匀分布、正态分布、指数分布等。
给定一个随机变量,我们对它的概率密度感兴趣。
例如,给定一个变量的随机样本,我们可能想知道概率分布的形状、最可能的值、值的分布范围以及其他属性。
了解随机变量的概率分布有助于计算分布的矩(如均值和方差),但也可用于其他更一般的考虑,例如确定某个观测值是否不太可能或非常不可能出现,并可能是一个异常值或异常情况。
问题是,我们可能不知道随机变量的概率分布。我们很少知道分布,因为我们无法访问随机变量的所有可能结果。事实上,我们只能访问观测样本。因此,我们必须选择一个概率分布。
这个问题被称为概率密度估计,或简称为“密度估计”,因为我们使用随机样本中的观测值来估计超出我们拥有的数据样本的概率的总体密度。
随机变量的密度估计过程包含几个步骤。
第一步是使用简单的直方图回顾随机样本中观测值的密度。从直方图中,我们可能能够识别出一个通用且易于理解的概率分布,例如正态分布。如果不能,我们可能需要拟合一个模型来估计分布。
在接下来的部分中,我们将逐一仔细研究这些步骤。
为简单起见,本文将重点关注单变量数据,即一个随机变量。虽然这些步骤也适用于多变量数据,但随着变量数量的增加,它们可能会变得更具挑战性。
想学习机器学习概率吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
用直方图总结密度
密度估计的第一步是创建随机样本中观测值的直方图。
直方图是一种绘图方法,首先将观测值分组到箱中,并计算落入每个箱中的事件数量。然后,每个箱中的计数或观测频率被绘制为条形图,箱位于 x 轴上,频率位于 y 轴上。
箱的数量选择很重要,因为它控制着分布的粗糙程度(条形图的数量),进而影响观测值的密度绘制得有多好。对于给定的数据样本,最好尝试不同的箱大小,以获得对同一数据的多个视角或视图。
例如,1 到 100 之间的观测值可以分成 3 个箱(1-33、34-66、67-100),这可能太粗糙,或者分成 10 个箱(1-10、11-20、…… 91-100),这可能更能捕捉到密度。
可以使用 Matplotlib 库和 hist() 函数创建直方图。数据作为第一个参数提供,箱的数量通过“bins”参数指定,可以是整数(例如 10),也可以是每个箱边界的序列(例如 [1, 34, 67, 100])。
下面的代码片段创建了一个具有 10 个箱的数据样本直方图。
1 2 3 4 |
... # 绘制样本的直方图 pyplot.hist(sample, bins=10) pyplot.show() |
我们可以创建一个从正态分布中抽取的随机样本,并假装我们不知道该分布,然后创建该数据的直方图。 NumPy 的 normal() 函数可以实现这一点,我们将生成 1000 个均值为 0、标准差为 1 的样本,例如标准高斯分布。
完整的示例如下所示。
1 2 3 4 5 6 7 8 |
# 绘制随机样本直方图的示例 from matplotlib import pyplot from numpy.random import normal # 生成样本 sample = normal(size=1000) # 绘制样本的直方图 pyplot.hist(sample, bins=10) pyplot.show() |
运行示例将绘制一个随机观测值样本,并创建具有 10 个箱的直方图。我们可以清楚地看到正态分布的形状。
请注意,由于数据样本的随机性,您的结果可能会有所不同。尝试运行示例几次。

具有 10 个箱的随机数据样本直方图
将示例的箱数设置为 3 会使正态分布不那么明显。

具有 3 个箱的随机数据样本直方图
使用不同数量的箱来回顾数据样本的直方图,将有助于确定密度是否看起来像一个常见的概率分布。
在大多数情况下,您会看到一个单峰分布,例如熟悉的钟形正态分布、平坦的均匀分布,或者指数分布或帕累托分布的递减或递增形状。
您也可能看到复杂的分布,例如在不同数量的箱下不会消失的多峰分布,称为双峰分布,或者多个峰,称为多峰分布。您也可能看到在某个值或一小范围内出现一个大峰,表明存在异常值,通常发生在远离其余密度的分布的尾部。
参数化密度估计
大多数随机样本的直方图形状将匹配一个广为人知的概率分布。
常见的分布之所以常见,是因为它们在不同且有时出乎意料的领域中反复出现。
熟悉常见的概率分布,因为这将帮助您从直方图中识别出给定的分布。
一旦识别出来,您就可以尝试用选定的概率分布来估计随机变量的密度。这可以通过估计数据样本的分布参数来完成。
例如,正态分布有两个参数:均值和标准差。有了这两个参数,我们就知道了概率分布函数。可以通过计算样本均值和样本标准差来从数据中估计这些参数。
我们将此过程称为参数化密度估计。
原因是,我们使用预定义的函数来总结观测值与其概率之间的关系,这些关系可以通过参数进行控制或配置,因此称为“*参数化*”。
一旦我们估计了密度,我们就可以检查它是否拟合良好。这可以通过多种方式完成,例如
- 绘制密度函数并将形状与直方图进行比较。
- 对密度函数进行采样,并将生成的样本与真实样本进行比较。
- 使用统计检验来确认数据是否符合该分布。
我们可以通过一个示例来演示这一点。
我们可以生成一个来自均值为 50、标准差为 5 的正态分布的 1000 个观测值的随机样本。
1 2 3 |
... # 生成样本 sample = normal(loc=50, scale=5, size=1000) |
然后,我们可以假设我们不知道概率分布,也许可以看直方图并猜测它是正态分布。假设它是正态分布,然后我们可以计算分布的参数,特别是均值和标准差。
鉴于样本量小以及采样过程中的噪声,我们预计均值和标准差不会恰好是 50 和 5。
1 2 3 4 5 |
... # 计算参数 sample_mean = mean(sample) sample_std = std(sample) print('Mean=%.3f, Standard Deviation=%.3f' % (sample_mean, sample_std)) |
然后用这些参数拟合分布,这就是我们数据样本的所谓参数化密度估计。
在这种情况下,我们可以使用 SciPy 的 norm() 函数。
1 2 3 |
... # 定义分布 dist = norm(sample_mean, sample_std) |
然后,我们可以为我们域中的值范围(在本例中为 30 到 70 之间)从该分布中采样概率。
1 2 3 4 |
... # 对一系列结果进行概率采样 values = [value for value in range(30, 70)] probabilities = [dist.pdf(value) for value in values] |
最后,我们可以绘制数据样本的直方图,并叠加从 PDF 中为值范围计算的概率的线图。
重要的是,我们可以将直方图中每个箱的计数或频率转换为归一化概率,以确保直方图的 y 轴与线图的 y 轴匹配。这可以通过在对 hist() 的调用中将“density”参数设置为“True”来实现。
1 2 3 4 |
... # 绘制直方图和 PDF pyplot.hist(sample, bins=10, density=True) pyplot.plot(values, probabilities) |
将这些代码片段结合起来,参数化密度估计的完整示例列在下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 参数化概率密度估计示例 from matplotlib import pyplot from numpy.random import normal from numpy import mean from numpy import std from scipy.stats import norm # 生成样本 sample = normal(loc=50, scale=5, size=1000) # 计算参数 sample_mean = mean(sample) sample_std = std(sample) print('Mean=%.3f, Standard Deviation=%.3f' % (sample_mean, sample_std)) # 定义分布 dist = norm(sample_mean, sample_std) # 对一系列结果进行概率采样 values = [value for value in range(30, 70)] probabilities = [dist.pdf(value) for value in values] # 绘制直方图和 PDF pyplot.hist(sample, bins=10, density=True) pyplot.plot(values, probabilities) pyplot.show() |
运行示例首先生成数据样本,然后估计正态概率分布的参数。
请注意,由于数据样本的随机性,您的结果可能会有所不同。尝试运行示例几次。
在这种情况下,我们可以看到均值和标准差存在一些噪声,并且与预期的 50 和 5 值略有不同。噪声很小,并且该分布预计仍将是一个良好的拟合。
1 |
均值=49.852,标准差=5.023 |
接下来,使用估计的参数拟合 PDF,并将具有 10 个箱的数据直方图与从 PDF 中采样的值的概率进行比较。
我们可以看到 PDF 与我们的数据非常匹配。

正态分布的概率密度函数叠加数据样本直方图
数据可能匹配一个常见的概率分布,但需要进行转换才能进行参数化密度估计。
例如,您可能存在偏离均值或分布质心的异常值。这可能会导致对分布参数的估计不准确,进而导致与数据的拟合不佳。在估计分布参数之前应删除这些异常值。
另一个例子是,数据可能具有偏斜或向左或向右偏移。在这种情况下,您可能需要在估计参数之前转换数据,例如取对数或平方根,或者更一般地,使用像 Box-Cox 变换这样的幂变换。
这些类型的数据修改可能不明显,有效的参数化密度估计可能需要一个迭代过程:
- 循环直到分布与数据的拟合足够好
- 1. 估计分布参数
- 2. 回顾生成的 PDF 与数据的对比
- 3. 转换数据以更好地拟合分布
非参数化密度估计
在某些情况下,数据样本可能不符合常见的概率分布,或者不容易使其符合分布。
当数据具有两个峰(双峰分布)或多个峰(多峰分布)时,通常是这种情况。
在这种情况下,参数化密度估计是不可行的,可以使用不使用通用分布的替代方法。相反,使用算法来近似数据的概率分布,而无需预定义的分布,这被称为非参数化方法。
这些分布仍然会有参数,但它们不像简单的概率分布那样可以直接控制。例如,非参数化方法可能使用随机样本中的所有观测值来估计密度,实际上使样本中的所有观测值都成为“参数”。
对于连续随机变量的概率密度函数的估计,也许最常用的非参数化方法称为核平滑,或核密度估计(简称 KDE)。
- 核密度估计:一种非参数化方法,用于使用数据集估计新点的概率。
在这种情况下,核是一个数学函数,它为随机变量的给定值返回一个概率。核有效地平滑或插值了随机变量结果范围内的概率,使得概率之和等于一,这是良好概率的必要条件。
核函数根据观测值与请求概率的给定查询样本的关系或距离来加权数据样本中观测值的贡献。
一个称为平滑参数或带宽的参数,控制了来自数据样本的用于估计给定样本概率的观测值的范围或窗口。因此,核密度估计有时也被称为 Parzen-Rosenblatt 窗口,或简称为 Parzen 窗口,这得名于该方法的开发者。
- 平滑参数(带宽):控制用于估计新点的概率的样本数量或样本窗口的参数。
较大的窗口可能导致密度粗糙且细节很少,而较小的窗口可能细节过多,不够平滑或不够通用,无法正确覆盖新的或未见的示例。窗口内的样本贡献可以通过不同的函数(有时称为基函数,例如均匀正态等)来塑造,这些函数对结果密度函数的平滑度有不同的影响。
- 基函数(核):选择的函数,用于控制数据集中样本对估计新点的概率的贡献。
因此,尝试不同的窗口大小和不同的贡献函数,并根据数据直方图评估结果可能会很有用。
我们可以通过一个示例来演示这一点。
首先,我们可以通过组合来自两个不同正态分布的样本来构建双峰分布。具体来说,300 个样本的均值为 20,标准差为 5(较小的峰),700 个样本的均值为 40,标准差为 5(较大的峰)。选择的均值彼此靠近,以确保分布在组合样本中重叠。
创建具有双峰概率分布的此样本并绘制直方图的完整示例列在下面。
1 2 3 4 5 6 7 8 9 10 11 |
# 双峰数据样本示例 from matplotlib import pyplot from numpy.random import normal from numpy import hstack # 生成样本 sample1 = normal(loc=20, scale=5, size=300) sample2 = normal(loc=40, scale=5, size=700) sample = hstack((sample1, sample2)) # 绘制直方图 pyplot.hist(sample, bins=50) pyplot.show() |
运行示例将创建数据样本并绘制直方图。
请注意,由于数据样本的随机性,您的结果可能会有所不同。尝试运行示例几次。
我们有比均值为 40 的样本少一些均值为 20 的样本,这可以在直方图中看到,其中 40 附近的样本密度比 20 附近的样本密度大。
具有这种分布的数据不容易被纳入常见的概率分布,这是故意的。这是使用非参数化核密度估计方法的典型情况。

具有双峰概率分布的数据样本直方图
scikit-learn 机器学习库提供了 KernelDensity 类,它实现了核密度估计。
首先,使用所需的带宽(窗口大小)和核(基函数)参数来构建该类。在数据上测试不同的配置是一个好主意。在这种情况下,我们将尝试带宽为 2,并使用高斯核。
然后通过 *fit()* 函数在数据样本上拟合该类。该函数期望数据具有 2D 形状,形式为 [行, 列],因此我们可以将数据样本重塑为 1000 行和 1 列。
1 2 3 4 5 |
... # 拟合密度 model = KernelDensity(bandwidth=2, kernel='gaussian') sample = sample.reshape((len(sample), 1)) model.fit(sample) |
然后,我们可以通过计算一系列观测值的概率并比较形状与直方图来评估密度估计与我们数据的匹配程度,就像我们在上一节的参数化情况中所做的那样。
KernelDensity 上的 *score_samples()* 函数将计算样本数组的对数概率。我们可以创建从 1 到 60 的样本范围(大约是我们域的范围),计算对数概率,然后通过计算指数或 *exp()* 来反转对数运算,将值返回到 0-1 的范围以获得正常概率。
1 2 3 4 5 6 |
... # 对一系列结果进行概率采样 values = asarray([value for value in range(1, 60)]) values = values.reshape((len(values), 1)) probabilities = model.score_samples(values) probabilities = exp(probabilities) |
最后,我们可以创建一个具有归一化频率的直方图,并叠加 KDE 模型估计的概率值线图。
1 2 3 4 5 |
... # 绘制直方图和 PDF pyplot.hist(sample, bins=50, density=True) pyplot.plot(values[:], probabilities) pyplot.show() |
将这些内容整合起来,双峰数据样本的核密度估计的完整示例列在下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 双峰数据样本的核密度估计示例 from matplotlib import pyplot from numpy.random import normal from numpy import hstack from numpy import asarray from numpy import exp from sklearn.neighbors import KernelDensity # 生成样本 sample1 = normal(loc=20, scale=5, size=300) sample2 = normal(loc=40, scale=5, size=700) sample = hstack((sample1, sample2)) # 拟合密度 model = KernelDensity(bandwidth=2, kernel='gaussian') sample = sample.reshape((len(sample), 1)) model.fit(sample) # 对一系列结果进行概率采样 values = asarray([value for value in range(1, 60)]) values = values.reshape((len(values), 1)) probabilities = model.score_samples(values) probabilities = exp(probabilities) # 绘制直方图和 PDF pyplot.hist(sample, bins=50, density=True) pyplot.plot(values[:], probabilities) pyplot.show() |
运行示例将创建数据分布,拟合核密度估计模型,然后绘制数据样本的直方图和 KDE 模型产生的 PDF。
请注意,由于数据样本的随机性,您的结果可能会有所不同。尝试运行示例几次。
在这种情况下,我们可以看到 PDF 与直方图非常匹配。它不够平滑,可以通过将“bandwidth”参数设置为 3 个样本或更高来使其更平滑。尝试不同的带宽值和核函数。

通过核密度估计的双峰数据样本的直方图和概率密度函数图
KernelDensity 类功能强大,并且支持对多维数据进行 PDF 估计。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 模式识别与机器学习, 2006.
- 机器学习:概率视角, 2012.
- 《统计学习要素:数据挖掘、推理和预测》, 2009.
API
- scipy.stats.gaussian_kde API.
- 非参数化方法 非参数化,Statsmodels API.
- 核密度估计 Statsmodels 示例.
- 密度估计,Scikit-Learn API.
文章
总结
在本教程中,您发现了概率密度估计的入门介绍。
具体来说,你学到了:
- 直方图提供了一种快速可靠的方法来可视化数据样本的概率密度。
- 参数化概率密度估计涉及选择一个通用分布,并从数据样本中估计密度函数的参数。
- 非参数化概率密度估计涉及使用一种技术来拟合模型以适应数据的任意分布,例如核密度估计。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
您好,感谢您发布了有用的文章!我想问一个问题。在参数化估计中,我应该首先计算 fist.pdf(假定为某个函数)而不是 30-69 的数字吗?我不确定为什么我们需要为新值而不是为先前生成的样本执行此操作。谢谢!
抱歉,我不明白您的问题。
您能详细说明一下吗?
当然。肯定表达得不好,抱歉。我们从均值为 50、标准差为 5 的正态分布中生成 1000 个数字,然后绘制这些值的直方图。我们假设我们不知道这个样本来自正态分布,从直方图中我们看到它确实可能来自正态分布。现在我们想实际估计这个实际的正态分布。它的 2 个参数(均值和标准差)的最佳估计是我们先前生成的样本的各自均值和标准差。
这就是我有点困惑的地方。我们想将这个正态分布“绘制”到直方图上,看看它是否拟合得很好。让我感到困惑的是,为什么我们要计算这个正态分布的概率密度函数(pdf)对于 30-69(range(30,70))这些值?用均值=样本均值和标准差=样本标准差的正态分布生成数字并计算这些值的 pdf 会错吗?甚至,计算这个正态分布的 pdf 对于先前生成的样本?我的意思是代码将是这样的:
probabilities = [dist.pdf(newsample) for index in newsample], where newsample = normal(mean_sample, mean_std, size = )
或者
probabilities = [dist.pdf(sample) for index in sample]
抱歉问题有点长,谢谢您的回答!
无需生成随机数,我们可以以一定的分辨率枚举域,并使用 pdf 获取图形 y 轴的概率。
这有帮助吗?
是的,我想我明白了。我们有从正态分布生成的数据(假设我们不知道),我们认为适合这些数据的分布是具有样本均值和样本标准差的正态分布。为了检验这一点,我们创建数据的直方图并绘制正态分布。我有点困惑,但是的,我现在明白了!
关于核密度估计,"fit" 函数基本上是采用我们的核函数并创建相应的估计 pdf,即 (1/Nh^d) * sum{ f( (x-xi) / h) }?抱歉表达得不是很好。谢谢!
差不多是这样,但是在局部层面,而不是跨整个域。
也抱歉重复发帖,但您知道 KernelDensity 函数可以接受均匀分布作为核函数吗?我查阅了文档,但我认为它不能,这似乎很奇怪!
是的,它会近似你拥有的任何东西。
太棒了,再次感谢您的指导!祝您有美好的一天。
不客气。
谢谢您
不客气。
你好,
抱歉,但您的指南似乎有一个错误。
您只绘制了 pyplot.hist 计算的密度,而不是您用 KernelDensity 计算的密度。
尝试使用
pyplot.hist(sample, bins=50, density=False)
您将不会看到任何密度,因为直方图数据与 PDF 的尺度不同。
T
感谢您的笔记,我会调查的。
更新:我相信示例是正确的。设置 density=True 可以确保直方图被缩放。线条图仍然绘制在直方图的顶部。
你好,感谢你的帖子!
我想将核密度估计的 AIC 与参数模型的 AIC 进行比较。我可以计算 KDE 的对数似然,但我如何知道 KDE 估计了多少个有效参数?它是否一定等于数据点的数量?可能加上带宽。
谢谢,
F d C
好问题,我建议查阅文献了解 KFD 特定的 AIC 计算方法,而不是自己推导。
一如既往的精彩博文,我刚将其应用于一个真实案例,以比较每种近似方法(参数 vs 非参数)在我的真实案例中的效果,结果很好(非参数获胜,谢谢!
顺便说一句,应用非参数选项不是也可以吗?因为它不假设任何分布,因此也适用于参数分布?这样我们就不用关心分布类型了。
谢谢!
是的,但我们应该对给定问题使用最简单的可行方法。
事实上,我曾乐观地希望就“数据的概率”是什么意思展开讨论。例如,当我们讨论生成模型时,我们会听到这个说法。我的意思是,如果有人想估计真实图像的概率,那是什么样的?我知道您可能会说这很难可视化,但一个 2*2 的图像对我来说就足够了:)
谢谢
我认为您指的是预测类标签的概率。
这将是给定输入数据条件下所有候选类的概率分布。
实际上我的确切问题是,例如,我有 3*3 的图像,并且我想估计这些数据的概率分布,以便能够从中采样新图像。然后,如果我将这些图像序列化为具有 9 个元素(特征)的一维向量;这意味着我有 9 个随机变量,然后我应该估计 9 个概率分布吗?还是可能是一个具有 9 个维度的概率分布?
抱歉,我不太明白。
您有 9 张图像,并且您想随机采样它们,那么这是一个均匀概率分布,或者任何图像被选中的概率是 1/9。
亲爱的 Jason,
在“参数密度估计”部分有一个输入错误。在该部分的第一段代码示例中,采样点数为 1000,但在其前面的两行中,提到了我们绘制了 100 个点的样本。
具体在哪里?
在第一段代码之前,我看到
在“参数密度估计”部分的第一个代码片段之前,也就是从头数第三个代码片段。
查找这个
“我们可以从均值为 50、标准差为 5 的正态分布中生成一个包含 100 个观测值的随机样本。”
谢谢!已修复。
亲爱的 Jason,
感谢您提供的有用的帖子。我想知道是否可以通过您的教程绘制 300 个样本的熵密度,或者我只能绘制一个样本的熵密度。
请尽快告知我,因为我需要它来撰写一篇正在审议的论文,而审稿人要求我为所有图像绘制熵密度。
提前感谢您的快速回复。
祝好
Maryam
抱歉,我不知道“熵密度”是什么意思。
你好,
感谢您提供的精彩教程!
我有两个问题
1) 如何在 KDE 完成估计后输出 PDF 的公式?
2) 如何使用 KDE 估计 2D 数据的联合 PDF?
提前感谢!
你不能,你有一个捕捉分布的模型。
好问题,我相信该库支持多元分布。也许可以尝试一下或查看文档。
嗨,Jason,
非常感谢您的回复。
我有一个后续问题。假设我的 PDF 的形式是 f(x,y),并且二维直方图表示为这样。使用 KDE,我捕获了分布。现在假设我需要对 f(x,y) 进行积分(即 \int f(x,y) dx)。对于我的分布,如果我不知道 f(x,y) 的公式,我如何输出有用的信息来进行积分?
提前表示感谢!
Ameir
一种方法是使用经验分布函数。
https://machinelearning.org.cn/empirical-distribution-function-in-python/
你好,
关于参数密度估计的问题:进入一个 bin 的最小样本数是多少?对于您的示例,10、20 和 40 个 bin(因此每个 bin 有 100、50 和 25 个样本)似乎与从样本均值和标准差计算出的正态分布(绘制为直方图上方的线)非常吻合。但是,如果我选择例如 80 个 bin,拟合就不那么明显了。在这种情况下,是否有建议的每个 bin 的最小样本数量?
我之前读过关于样本均值样本的概念,它说基本上如果你的样本量大于 30 并且你收集了多个这样的样本,那么样本均值的均值就会接近“真实均值”。这是否在这里以某种方式适用于选择进入一个 bin 的样本数量?
也许有,我不知道。也许用你的数据进行实验。或者也许参考“进一步阅读”部分的一些内容。
我认为您指的是中心极限定理。
https://machinelearning.org.cn/a-gentle-introduction-to-the-central-limit-theorem-for-machine-learning/
或者大数定律
https://machinelearning.org.cn/a-gentle-introduction-to-the-law-of-large-numbers-in-machine-learning/
嗨,Jason,
核密度估计器能否给出连续分布的函数,而不是限制在数据范围内的点数组?当我想绘制生成的分布时,它总是在数据极限处被截断,这有时会导致图形不好看(而不是在边界处减小到零)。当我的核是连续的高斯分布时,KDE 应该提供一个连续的函数。
是的,KDF 提供一个可以查询的连续函数。
如何找到数据集中相关/类别变量的概率密度函数?
您可以使用任何数据的经验分布。
https://machinelearning.org.cn/empirical-distribution-function-in-python/
嗨,Jason,
关于条件概率的问题:例如,我有 PDF P(A丨B),但如何像您一样绘制这张图?它是选择一个常量值 B 并绘制直方图吗?
也许是两个变量样本的散点图?
非常感谢,亲爱的 Jason Brownlee
这非常有帮助,我对此很感兴趣,希望能为真实世界的数据集生成连续的 PDF。请推荐一些书籍和研究论文供我在这方面工作。
Rafiullah,统计学助理教授,学院级别。
感谢这篇文章,信息量很大。只是想提醒一下,使用 sample.reshape(-1,1) 比使用 sample.reshape((len(sample), 1)) 更好。
谢谢,我更喜欢明确的方法。
我有两个长度不同的向量,我需要比较它们的概率密度函数。我该如何做到?是否应该在绘图前对两个向量进行归一化,以避免两个向量大小不同的问题?
长度不同的向量不应该成为问题。您仍然可以使用 pyplot.hist() 在同一张图上绘制它们的密度。
你好!
这是对该主题的非常好的总结性介绍。我确实需要更多关于参数估计部分的信息,其中一些样本(尾部样本)被忽略以获得更好的估计。我有一个符合描述的问题。如果您能参考一个有算法或描述如何最优地选择样本的某个窗口以获得最佳估计的理论基础参考文献,那将非常有帮助。一个直观的方法可能是例如获取与方差相关的更接近均值值的样本。
您好,
非常感谢您!我可以自信地说,我对密度估计有了更好的理解。
谢谢你的反馈!
嗨 Jason
感谢这篇文章。我觉得它非常有帮助。
我突然想到,直方图的 y 轴可以代表每个条形表示
一个 bin
(1) 频率:bin 中数据点的数量。
(2) 相对频率:(bin 中的数据点数/总数据点数) x 100。
(3) 概率:bin 的条形面积/直方图总面积。
这是对的吗?因为 bin 的大小可能不同,所以我们使用面积来分配
每个 bin 的概率?
绝对是,Darshan!您的理解是正确的!继续保持出色的工作!
嗨,Jason,
感谢这个信息量很大的教程,您的概率方面的书也解释得很清楚。
Ehtisham,非常好的反馈!
亲爱的布朗利博士
感谢您所有有用且流畅的解释。
我有一个问题:在非参数概率估计中,最终答案是否需要一个分布?
你好 RHZ……以下信息可能有助于澄清
https://faun.pub/parametric-and-nonparametric-machine-learning-algorithm-6134d7155cc
您是否有从头开始实现算法的文章或一些指导?
你好 george……以下资源可能对您有所帮助
https://billc.io/2023/01/kde-from-scratch/