【问题标题】:How to generate random numbers from cut-off log-normal distribution in Matlab?如何从 Matlab 中的截止对数正态分布生成随机数?
【发布时间】:2012-01-20 21:46:48
【问题描述】:

半径r取自截止对数正态分布,其具有以下概率密度函数:

pdf=((sqrt(2).*exp(-0.5*((log(r/rch)).^2)))./((sqrt(pi.*(sigma_nd.^2))...
    .*r).*(erf((log(rmax/rch))./sqrt(2.*(sigma_nd.^2)))-erf((log(rmin/rch))./sqrt(2.*(sigma_nd.^2))))));

rchsigma_ndrmaxrmin 都是常量。

我从网上找到了解释,但似乎很难找到它的积分然后在Matlab中取逆。

【问题讨论】:

  • 您能描述一下 PDF 的来源吗?即底层分布应该是什么。
  • @Nzbuu:请在您的答案中发表评论并更新相关评论。

标签: matlab statistics distribution random-sample probability-density


【解决方案1】:

如果你的 PDF 是连续的,那么你可以积分得到一个 CDF,然后找到 CDF 的倒数并在随机值处评估它。

如果您的 PDF 不连续,那么您可以使用 cumsum 获得离散 CDF,并将其用作 interp() 中的初始 Y 值,初始 X 值与 PDF 的采样值相同,并且要求在您的 rand() 数字数组中进行插值。

【讨论】:

  • 我在网上找到了解释,但我无法得到它的积分和逆。你能发布解决方案吗?
  • @S_H 您可以使用cumtrapz 对 PDF 进行数值积分。
【解决方案2】:

我检查过,但我的第一直觉是,log(r/rch) 看起来像是 truncated normal distribution,限制为 log(rmin/rch)log(rmax/rch)。所以你可以生成适当的截断正态随机变量,比如y,然后是r = rch * exp(y)

您可以通过生成未截断的值并替换超出限制的值来生成截断的正态随机变量。或者,您可以使用 CDF,如 @PengOne 所述,您可以在 wikipedia page 上找到它。

我(仍然)不确定你的 p.d.f.完全正确,但这里最重要的是分布。

【讨论】:

  • PDF 是一个截止对数正态分布。
  • 我是这么认为的。生成截断的正常 r.v.并按照描述采用指数。
【解决方案3】:

对于您的发行版来说可能有点矫枉过正 - 但您始终可以写一个 Metropolis sampler

另一方面 - 实施是直截了当的,因此您可以非常快速地拥有您的采样器。

【讨论】:

    【解决方案4】:

    不清楚你的变量是什么,但我假设它是r

    正如 Chris 所说,最简单的方法是首先获取 cdf(请注意,如果 r 从 0 开始,pdf(1) 是 Nan... 将其更改为 0):

    cdf = cumtrapz(pdf);
    cdf = cdf / cdf(end);
    

    然后产生一个均匀分布(size_dist 表示元素个数):

    y = rand (size_dist,1);
    

    随后是一种沿 cdf 分布的方法。任何技术都可以,但这里是最简单的(虽然不优雅)

    x = zeros(size_dist,1);
    for i = 1:size_dist
        x(i) = find( y(i)<= cdf,1);
    end
    

    最后,返回原始 pdf。使用 matlab 数值索引来反转路线。注意:使用r 而不是pdf

    pdfHist = r(x);
    hist (pdfHist,50)
    

    【讨论】:

    • 嗨拉斯曼。感谢您的回答。当我按如下方式运行时出现错误:??? Improper assignment with rectangular empty matrix. 在线 x(i) = find(y(i)&lt;=cdf,1)
    • 确保已定义 cdf(相对于 null)。如果 pdf 的任何元素是 Nan,它将为 null(例如 @0,matlab 将计算它为 Nan;因此我的注释:将其更改为零)
    • CDF 定义是否明确(只需绘制它)? sum(pdf) 是实数吗?你是如何定义r的?如果 pdf 定义明确(即对于 r >= 0 的所有值),cumtrapz(pdf) 应该产生一个实数。
    猜你喜欢
    • 2012-12-11
    • 2017-04-17
    • 2015-03-22
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2023-04-03
    • 2021-09-01
    相关资源
    最近更新 更多