在 Julia 中估计概率分布并从中采样
Posted
技术标签:
【中文标题】在 Julia 中估计概率分布并从中采样【英文标题】:Estimating a probability distribution and sampling from it in Julia 【发布时间】:2017-03-01 07:16:27 【问题描述】:我正在尝试使用 Julia 使用 N 个观察到的数据点(存储为 Float64
数字的数组)来估计一个连续的单变量分布,然后从这个估计的分布中采样。我没有先验知识限制对某些分布系列的关注。
我正在考虑使用 KernelDensity 包来估计分布,但我不确定如何从结果输出中进行采样。
任何帮助/提示将不胜感激。
【问题讨论】:
感谢您的编辑,@fengyang! (抱歉错别字!) 【参考方案1】:对估计分布没有任何限制,一个自然的候选者将是经验分布函数(参见Wikipedia)。对于这个分布,有非常好的关于收敛到实际分布的定理(参见Dvoretzky–Kiefer–Wolfowitz inequality)。
有了这个选择,采样就特别简单。如果dataset
是当前样本的列表,那么dataset[rand(1:length(dataset),sample_size)]
是来自经验分布的一组新样本。使用 Distributions 包,它可能更具可读性,如下所示:
using Distributions
new_sample = sample(dataset,sample_size)
最后,核密度估计也不错,但可能需要选择一个参数(核及其宽度)。这表明了对某个分布族的偏好。从核分布中抽样与从经验分布中抽样惊人地相似: 1. 从经验分布中选择一个样本; 2. 使用核函数中的样本扰动每个样本。
例如,如果核函数是宽度为w
的正态分布,则扰动样本可以计算为:
new_sample = dataset[rand(1:length(dataset),sample_size)]+w*randn(sample_size)
【讨论】:
“惊人地相似” -> “直接等效” 谢谢你,@DanGetz!如此简单、整洁的解决方案! @Chai 我只是想补充一点,DanGetz 在这个非常好的答案中提出的是,出于所有实际目的,一个 iid 引导程序。请注意,如果您的数据不是 iid(例如,如果它是时间序列数据),那么您可能需要使用更稳健的采样方案,例如如果您希望重新采样的数据具有与原始数据相同的统计属性,则为依赖引导程序。 顺便说一句,@DanGetz,我认为代码 sn-p new_sample = dataset[rand(1:length(dataset),sample_size)+wrandn(sample_size) 缺少右方括号在噪声项之前,应该是: new_sample = dataset[rand(1:length(dataset),sample_size)+wrandn(sample_size) 我自己无法进行此编辑(编辑太短... ),但是对于将来看到此内容的任何人来说,这将是一件好事。你能做这个编辑吗?谢谢! @ARM 如果您需要进行依赖引导,我已经为它编写了一个包here。我还没有将它添加到元数据中,但我希望将它更新到 v0.5 并在接下来的一两个月的某个时间添加。以上是关于在 Julia 中估计概率分布并从中采样的主要内容,如果未能解决你的问题,请参考以下文章
pytorch 笔记:torch.distributions 概率分布相关(更新中)