绘制归一化均匀混合物

Plot normalized uniform mixture

我需要在下面重现归一化密度 p(x),但给出的代码不会生成归一化 PDF。

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);

混合

A mixture 两个随机变量意味着概率 p 使用分布 1,概率 1-p 使用分布 2.

根据你的图表,你似乎在混合分布而不是添加(卷积)它们。精确的结果对 混合概率 非常重要。例如,我选择了 a = 0.25b = 0.35c = 1-a-b

对于混合物,probability density function (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')

由于混合分布是统一的,您还可以使用 stairs() 命令:stairs(Xrng,pdfMix(Xrng)).

我们可以通过确保总面积为 1 来验证这是一个有效的 PDF。
integral(pdfMix,0,9)

ans = 1.0000


卷积:添加随机变量

将随机变量相加会产生不同的结果。同样,这可以凭经验轻松完成。这在分析上是可能的。例如,对两个 Uniform(0,1) 分布进行卷积会产生一个 Triangular(0,1,2) 分布。随机变量的 convolution 只是一种奇特的说法,我们 将它们相加 如果您对分析结果感兴趣,还有一种方法可以使用积分获得生成的 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-axis (Xrng = 0:.01:16;) 的比例变化。

为了获得这个,我从每个分布中生成了 80k 个样本 random() then added them up to obtain 80k samples of the desired convolution. Notice when I used 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)')

您可以在生成的内核分发对象上使用 fitdist() and the Kernel distribution object then calling the pdf() 命令获得 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(). You could also use the ksdensity() function, though the probability distribution object approach is probably more user friendly due to all the functions 知道边界。您应该知道内核是一个近似值(您可以在内核图中清楚地看到)。在这种情况下,对 3 个均匀分布进行卷积的集成并不算太糟糕,因此如果需要 PDF,则通过分析找到 PDF 可能是首选。否则,经验方法(尤其是对于生成)可能就足够了,尽管这取决于您的应用程序。

pdt_kernel = truncate(pd_kernel,9,16)

从混合和卷积生成样本是一个不同的问题(但可管理)。