Участок нормализованной однородной смеси - PullRequest
3 голосов
/ 25 июня 2019

Мне нужно воспроизвести нормализованную плотность p (x) ниже, но приведенный код не генерирует нормализованный PDF.

A plot of p of x

clc, clear
% Create three distribution objects with different parameters
pd1 = makedist('Uniform','lower',2,'upper',6);
pd2 = makedist('Uniform','lower',2,'upper',4);
pd3 = makedist('Uniform','lower',5,'upper',6);
% Compute the pdfs
x = -1:.01:9;
pdf1 = pdf(pd1,x); 
pdf2 = pdf(pd2,x); 
pdf3 = pdf(pd3,x); 
% Sum of uniforms
pdf = (pdf1 + pdf2 + pdf3);
% Plot the pdfs
figure;
stairs(x,pdf,'r','LineWidth',2);

Если я вычислю нормализованную смесь PDF, просто масштабируя их по их общей сумме, я получу другую нормированную вероятность по сравнению с исходным рисунком выше.

pdf = pdf/sum(pdf);

1 Ответ

4 голосов
/ 25 июня 2019

Смесь

A смесь двух случайных величин означает с вероятностью p использование Распределения 1, а с вероятностью 1- p использование Распределения 2.

Судя по вашему графику, вы смешиваете распределения, а не добавляете (сворачиваете) их. Точные результаты очень важны для вероятностей смешивания . В качестве примера я выбрал a = 0.25, b = 0.35 и c = 1-a-b.

Для смеси аналитически доступна функция плотности вероятности (PDF) :
pdfMix =@(x) a.*pdf(pd1,x) + b.*pdf(pd2,x) + c.*pdf(pd3,x).

% MATLAB R2018b
pd1 = makedist('Uniform',2,6);
pd2 = makedist('Uniform',2,4);
pd3 = makedist('Uniform',5,6);
a = 0.25;
b = 0.35;
c = 1 - a - b;    % a + b + c = 1

pdfMix =@(x) a.*pdf(pd1,x) + b.*pdf(pd2,x) + c.*pdf(pd3,x);

Xrng = 0:.01:8;
plot(Xrng,pdfMix(Xrng))
xlabel('X')
ylabel('Probability Density Function')

Mixture probability density function.

Поскольку смешанные распределения являются однородными, можно также использовать команду stairs: stairs(Xrng,pdfMix(Xrng)).

Мы можем убедиться, что это действительный PDF, убедившись, что общая площадь равна 1.
integral(pdfMix,0,9)

и = 1,0000


Свертка: Добавление случайных величин

Добавление случайных величин вместе дает другой результат. Опять же, это можно сделать эмпирически легко. Это возможно аналитически. Например, свертывание двух равномерных (0,1) распределений дает треугольное (0,1,2) распределение. свертка случайных переменных - это просто причудливый способ сказать, что мы складываем их и есть способ получить полученный PDF с использованием интеграции, если вам интересны аналитические результаты.

N = 80000;                  % Number of samples
X1 = random(pd1,N,1);       % Generate samples     
X2 = random(pd2,N,1);
X3 = random(pd3,N,1);

X = X1 + X2 + X3;           % Convolution      

Обратите внимание на изменение масштаба для оси x (Xrng = 0:.01:16;).

Resulting histogram from convolution (adding RVs)

Чтобы получить это, я сгенерировал 80 тыс. Выборок из каждого распределения с random, а затем сложил их, чтобы получить 80 тыс. Выборок желаемой свертки. Обратите внимание, когда я использовал histogram, я использовал опцию 'Normalization', 'pdf'.

Xrng = 0:.01:16;
figure, hold on, box on
p(1) = plot(Xrng,pdf(pd1,Xrng),'DisplayName','X1 \sim U(2,6)')
p(2) = plot(Xrng,pdf(pd2,Xrng),'DisplayName','X2 \sim U(2,4)')
p(3) = plot(Xrng,pdf(pd3,Xrng),'DisplayName','X3 \sim U(5,6)')
h = histogram(X,'Normalization','pdf','DisplayName','X = X1 + X2 + X3')

% Cosmetics
legend('show','Location','northeast')
for k = 1:3
    p(k).LineWidth = 2.0;
end
title('X = X1 + X2 + X3 (50k samples)')
xlabel('X')
ylabel('Probability Density Function (PDF)')

Вы можете получить оценку PDF, используя fitdist и объект распределения ядра , затем вызвав команду pdf в полученном ядре распределительный объект.

pd_kernel = fitdist(X,'Kernel')

figure, hold on, box on
h = histogram(X,'Normalization','pdf','DisplayName','X = X1 + X2 + X3')
pk = plot(Xrng,pdf(pd_kernel,Xrng),'b-')           % Notice use of pdf command
legend('Empirical','Kernel Distribution','Location','northwest')

Если вы сделаете это, вы заметите, что полученное ядро ​​не ограничено, но вы можете исправить это, поскольку вы знаете границы, используя truncate. Вы также можете использовать функцию ksdensity, хотя подход к объекту распределения вероятностей, вероятно, более удобен для пользователя благодаря всем функциям , к которым у вас есть прямой доступ. Вы должны знать, что ядро ​​является приближенным (вы можете ясно видеть это на графике ядра). В этом случае интеграция для свертки 3-х равномерных распределений не так уж плоха, поэтому поиск PDF-файла аналитически, вероятно, является предпочтительным выбором, если PDF-файл необходим. В противном случае, эмпирических подходов (особенно для генерации), вероятно, достаточно, хотя это зависит от вашего приложения.

pdt_kernel = truncate(pd_kernel,9,16)

Kernel density

Создание образцов из смесей и извилин - это другая проблема (но решаемая).

...