【问题标题】:Matlab: generate random numbers from normal distribution with given probabilityMatlab:从给定概率的正态分布中生成随机数
【发布时间】:2014-02-25 13:14:08
【问题描述】:

如下面的代码所示,我目前正在从Normal Distribution 生成random 数字,并选择-3*sigma3*sigma 区间内的数字。但是,我现在想生成数字,以便我从-3*sigma3*sigma 区间之外选择数字的可能性更高。例如。来自[-4*sigma -3*sigma) 的数字应该具有35% 被选中的概率,并且与[3*sigma 4*sigma) 相同。 基本上,我会多次调用这个函数,我想知道是否有一种方法可以让我从正态分布的“尾部”中选择更高比例的随机数,而不会实际改变正态分布的形状分发。我正在努力做到这一点。

function [new_E11, new_E22] = elasticmodulusrng()

new_E11 = normrnd(136e9,9.067e9,[1 1]);

new_E22 = normrnd(8.9e9,2.373e9,[1 1]);

while new_E11<=-3*9.067e9 && new_E11>=3*9.067e9
        new_E11 = normrnd(136e9,9.067e9,[1 1]);
end

while new_E11<=-3*2.373e9 && new_E11>=3*2.373e9
        new_E22 = normrnd(8.9e9,2.373e9,[1 1]);
end

谢谢

【问题讨论】:

  • 但在这种情况下,它将不再是正态分布。你想如何改变它的形状?
  • 我基本上想为new_E11 生成正态分布,例如,使用平均值 136e9 和 S.D. 9.067e9 然后我想从区间 [-4*sigma -3*sigma) 和 [3*sigma 4*sigma) 中选择点,每个点的概率为 35%。这可能吗?
  • 这些点出现的概率是由分布的形状决定的,比那个小很多。
  • @Jojo 不可能使用 normal 分布来做到这一点。您必须选择不同类型的分发来实现此目的。也许通过调整偏度或峰度,但更有可能通过选择完全不同的分布。

标签: matlab random


【解决方案1】:

正如 Jojo 指出的那样,这个问题没有多大意义:这不再是正态分布。

您可以做的是创建自己的概率密度函数pdf 并从中提取。

例如,

N = pdf('Normal',-5:0.2:5,0,1);

为您提供具有良好分辨率的普通 PDF。 你可以改变它,说

Z = N;
Z(5:15)=3*Z(5:15);
Z(35:45)=3*Z(35:45);

并按照here 的说明使用直接方法、反转方法或接受-拒绝方法

FileExchange 中有一个实现: http://www.mathworks.com/matlabcentral/fileexchange/27590-simple-rejection-sampling

【讨论】:

  • 我明白你的意思。我一直在研究在获得 N 的“目标分布”时使用接受 - 拒绝方法。但是,我不知道如何对作为正态分布尾部的“建议分布”进行建模?谢谢