matlab - 从正态分布中选择的随机变量出现的概率

标签 matlab probability normal-distribution

我只是想知道,通过下面的代码,我将如何确定与所选随机变量之一相关的发生概率。例如,如果为 new_E11 选择一个特定变量,我如何知道它从正态分布中出现的概率?

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<=136e9-3*9.067e9 && new_E11>=136e9+3*9.067e9
        new_E11 = normrnd(136e9,9.067e9,[1 1]);
end

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

谢谢

最佳答案

任何特定值的概率为零(嗯,实际上大约是 2^64 中的 1 部分...这就是有多少个不同的 float ,因为它们由 64 位二进制表示;并且它们的可能性并不相同,因此答案比这更复杂)。

更好的问题是“概率密度是多少” - 可以描述为极限

P(x - dx < X < x + dx)
----------------------
        2 * dx

这实际上是“概率密度函数”或 PDF 的定义。在您的情况下,您使用的是具有平均 mu 和标准差 sigma 的正态分布,然后

pdf(X) = exp(-(X-mu)*(X-mu) / (2 * sigma * sigma)) / (sqrt(2.0*pi) * sigma)

如果您确实想要原始问题的答案,您会查看您感兴趣的值的 X 值的最小增量(尾数中的一个最低有效位)。将是您的 delta X,然后您可以计算实际答案(警告 - 不仅它很小,而且可能很难在不遇到重大舍入误差的情况下计算它。这很难。)

进一步的思考:

您测试该值的限制是否在 +- 3 sigma 之内,并继续下去,直到达到为止。这意味着您人为地稍微增加了概率 - 因为您的值始终来自范围的特定部分(总概率小于 1),所以您需要将 PDF 乘以 (1/p) 其中 p 是从 -33 的标准正态分布的积分,或 0.9973 。因此,在您的情况下,上述公式会低估概率 0.27%

建议针对您的代码的一些风格建议。请考虑以下事项(为您的代码提供相同的结果):

function [new_E11, new_E22] = elasticmodulusrng()
  % returns randomly distributed modulus 
  % keeping the value within +- 3 standard deviations
  % identify the constants up front
  mean11 = 136e9;
  stdv11 = 9.067e9;
  mean22 = 8.9e9;
  stdv11 = 2.373e9;

  % compute the values
  new_E11 = normRandLimit(mean11, stdv11, [-3 3]);
  new_E22 = normRandLimit(mean22, stdv22, [-3 3]);

function rr = normRandLimit(m, s, b)
% helper function in the same file
% returns a normally distributed random variate
% with mean m, standard deviation s
% within limits [mean + b(1)*s,  mean + b(2)*s]

  while true 
    rr = randn(1); % doesn't need statistics toolbox - scale later
    if( rr > b(1) && rr < b(2) )
      break;  % found acceptable value
    end
  end
  % now apply scaling:
  rr = rr * s + m;

注意事项:

  1. “魔数(Magic Number)”有一个合理的名称,并且都位于代码顶部
  2. “限制内的随机数”的计算被归入一个单独的函数
  3. 使用 randn 而不是 normrnd(因此无需绑定(bind)统计工具箱许可证)
  4. 计算“好数字”后计算缩放
  5. 重复的代码已被消除
  6. 从结构(和注释)中可以更明显地看出发生了什么

所有这些加起来就是“更好”的代码 - 从某种意义上说,它更容易调试和维护。当您在六个月后看到自己的代码时,您仍然可以阅读它......

关于matlab - 从正态分布中选择的随机变量出现的概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22074631/

相关文章:

python - Python 中的二进制线性规划求解器

arrays - 如何将一个字符作为 MATLAB 数组重复多次?

c++ - 使用 Boost::accumulators 查找超过 (µ + 3 sigma) 的值

c# - 使用 .Net 的 StatisticFormula 库

r - 如何在 gplot 中添加样本垂直线?

python - matlab 的 fminsearch 的 numpy/scipy 模拟

arrays - MATLAB中没有for循环的多个数组的交集

machine-learning - 使用朴素贝叶斯分类

neural-network - 如何在多类分类任务中校准神经网络输出层的阈值?

r - 如何使用[R]中的函数曲线绘制正态曲线?