Построение двух наборов данных на одной гистограмме
Я только начал использовать Octave и пытаюсь смоделировать 10 000 результатов биномиальной случайной величины, определенной как:
X ~ Bi (5, 0,2)
Я получил результат с помощью следующей функции:
function x = generate_binomial_bernoulli(n,p,m)
% generate Bi(n, p) outcomes m times
x = 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
x(i) = successes; % store the number of successful trials in this simulation
end
alphabet_x=[0:n]; % create an array from 0 to n
hist(x,alphabet_x); % plot graph
end
Затем я вызываю функцию с generate_binomial_bernoulli(5, 0.2, 10000)
,
Это моделирует 5 испытаний Бернулли, каждое из которых с вероятностью успеха 0,2, повторяет 5 испытаний 10 000 раз и строит график распределения количества успехов. Этот график показывает эмпирические результаты моделирования.
Теперь меня также попросили построить теоретические результаты, которые, как я полагаю, будут представлять собой нормально распределенный график примерно с 1 успехом по оси X (0,2 * 5 = 1).
- Как я мог создать этот график и отобразить его на той же гистограмме?
- Как я могу правильно отобразить мой график с осью X, охватывающей всего от 0 до 5, с обеими осями с метками и двумя гистограммами, помеченными цветом с легендой?
РЕДАКТИРОВАТЬ
Вот моя текущая функция, где я попытался построить нормализованную / теоретическую кривую:
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
Как показано ниже, эта кривая распространяется только на очень низкую высоту вдоль оси y, но я не знаю, как охватить ее по всему набору данных.
1 ответ
Получить количество гистограмм и количество бинов:
[counts,centers] = hist(x);
Нормализация:
freq = counts/sum(counts);
Нарисуйте нормализованную гистограмму:
bar(centers,freq)