【问题标题】:Generating a triangular distribution in Matlab在 Matlab 中生成三角分布
【发布时间】:2012-03-03 18:08:38
【问题描述】:

我曾尝试在 Matlab 中生成三角概率分布,但没有成功。我使用了http://en.wikipedia.org/wiki/Triangular_distribution的公式。

n = 10000000;

a = 0.2;
b = 0.7;
c = 0.5;

u = sqrt(rand(n, 1));

x = zeros(n, 1);
for i = 1:n
    U = u(i);
    if U < (c-a)/(b-a)
        X = a + sqrt(U*(b-a)*(c-a));
    else
        X = b - sqrt((1-U)*(b-a)*(b-c));        
    end
    x(i) = X;
end

hist(x, 100);

直方图如下所示:

在我看来并不像一个三角形。有什么问题?我在滥用rand(n)吗?

【问题讨论】:

    标签: matlab random distribution probability


    【解决方案1】:

    此示例使用makedist()pdf() 命令。

    a = 2; m = 7; b = 10;
    N = 50000;                             % Number of samples
    pd = makedist('Triangular',a,m,b);     % Create probability distribution object
    
    T = random(pd,N,1);                    % Generate samples from distribution
    

    三角分布,下限 a = 7,众数 m = 10,上限 b = 10。

    % Plot PDF & Compare with Generated Sample
    X = (a-2:.1:b+2);
    
    figure, hold on, box on
    histogram(T,'Normalization','pdf') % Note normalization-pdf option name-value pair
    title([num2str(N) ' Samples'])
    plot(X,pdf(pd,X),'r--','LineWidth',1.8)
    legend('Empirical Density','Theoretical Density','Location','northwest')
    

    MATLAB 在 R2013a 中引入了makedist()。需要统计工具箱。

    参考:
    Triangular Distribution

    【讨论】:

      【解决方案2】:

      你可以将两个均匀分布相加,分布图进行卷积,得到一个三角分布。

      通俗易懂的例子:掷两个骰子,每个动作均匀分布产生1-6的数字,组合动作呈三角形分布产生2-12的数字

      编辑:最小的工作示例:

      a=randint(10000,1,10);
      b=randint(10000,1,10);
      
      c=a+b;
      
      hist(c,max(c)-min(c)+1)
      

      edit2:再次查看您的脚本。它有效,但你犯了一个错误:

      u = sqrt(rand(n, 1));
      

      应该是

      u = rand(n, 1);
      

      edit3:优化代码

      n = 10000000;
      
      a = 0.2;
      b = 0.7;
      c = 0.5;
      
      u = rand(n, 1);
      x = zeros(n, 1);
      
      idx = find(u < (c-a)/(b-a));
      x(idx) = a + sqrt(u(idx)*(b-a)*(c-a));
      idx =setdiff(1:n,idx);
      x(idx) = b - sqrt((1-u(idx))*(b-a)*(b-c));
      hist(x, 100);
      

      【讨论】:

      • 两件制服的总和是迄今为止最简单的方法。但是,您也可以反转 CDF,这仅需要一次 rand 调用,但数学运算稍多。
      • 是的,两个制服的总和是最简单的,但它只对对称三角形分布有用。 topicstart 中的代码允许任何三角形。顺便说一句,我相信您仍然可以通过使用逻辑索引来删除循环来优化该代码..
      • 我不知道为什么你会称“edit3:优化代码”为优化,因为它的运行时间是 OP(更正)代码的两倍。使用 'find' 和 'setdiff' 向量化一个简单的 for 循环不会使代码优化。
      【解决方案3】:

      改变

      u = sqrt(rand(n, 1));
      

      u = rand(n, 1);
      

      这个公式的好处在于,您可以使用单个随机样本从一般三角形分布中分配样本。

      【讨论】:

        猜你喜欢
        • 2012-12-10
        • 2015-01-13
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2014-07-29
        相关资源
        最近更新 更多