0

我正在尝试编写一个函数来生成5 个伯努利试验的m个随机模拟。我创建了一个直方图,显示了m次模拟中成功次数的分布。

然后,我还需要绘制一条线,显示围绕理论平均成功次数的理论/归一化分布。

这是我现在的功能:

function x = generate_binomial_bernoulli(n,p,m)
  % generate Bi(n, p) outcomes m times

  emperical = zeros(1,m);             % allocate array for m simulations
  for i = 1:m                         % iterate over m simulations
    successes = 0;                    % count the number of successful trials per simualtion (0-5)
    for j = 1:n                       % iterate through the n trials
      u = rand;                       % generate random nuumber from 0-1
      if (u <= p)                     % if random number is <= p
        successes++;                  % count it as a success
      endif
    end
    emperical(i) = successes;         % store the number of successful trials in this simulation
  end

  close all;                          % close any existing graphs

  x_values = [0:n];                   % array of x-axis values        
  hist(emperical, x_values, "facecolor", "r"); % plot empirical data
  xlim([-0.5 (n + 0.5)]);             % set x-axis to allow for histogram bar widths

  hold on;                            % hold current graph

  mean = n * p;                       % theoretical mean
  norm = normpdf(x_values, mean, 1);  % normalised y values
  plot(x_values, norm, "color", "b"); % plot theoretical distribution

  legend('Emprical', 'Theoretical');   

end

当函数被调用为

generate_binomial_bernoulli(5, 0.2, 100)

我希望看到一个红色直方图显示 100 次模拟的结果(经验结果),然后是一个蓝线图,围绕 1 次成功的平均值进行归一化(理论结果)。

这是生成的图表:

在此处输入图像描述

经验结果正确显示,但理论图仅延伸到 y 轴上非常低的值的高度。

我的功能哪里出错了?

4

1 回答 1

1

“normpdf”是概率密度函数。因此,您看到低于 1 的数字是“正常的”。但是,直方图返回您的数字的频率,这不是概率。也许您想标准化您的频率并将它们视为概率。

freqs=hist(emperical, x_values, 'facecolor', 'r'); % plot empirical data
freqs=freqs/sum(freqs);
figure; bar(x_values,freqs)
于 2017-03-23T18:46:28.880 回答