首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >绘制归一化均匀混合图

绘制归一化均匀混合图
EN

Stack Overflow用户
提问于 2019-06-25 23:29:04
回答 1查看 484关注 0票数 4

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

代码语言:javascript
复制
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,那么与上图相比,我具有不同的归一化概率。

代码语言:javascript
复制
pdf = pdf/sum(pdf);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 01:27:45

混合

两个随机变量的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)

代码语言:javascript
复制
% 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

卷积:添加随机变量

将随机变量加在一起会产生不同的结果。同样,这可以通过经验很容易地完成。这在分析上是可能的。例如,将两个均匀的(0,1)分布卷积得到三角形(0,1,2)分布。随机变量的convolution只是一种奇特的方式,表示我们将它们相加,如果你对分析结果感兴趣,有一种方法可以使用积分获得最终的。

代码语言:javascript
复制
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;)的比例更改。

为了获得这一点,我使用random()从每个分布中生成80k个样本,然后将它们相加,以获得所需卷积的80k个样本。注意,当我使用histogram()时,我使用了'Normalization', 'pdf'选项。

代码语言:javascript
复制
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()Kernel distribution object获得PDF的估计值,然后在生成的内核分布对象上调用pdf()命令。

代码语言:javascript
复制
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()函数,不过由于您可以直接访问all the functions,因此概率分布对象方法可能对用户更友好。您应该知道内核是近似值(您可以在内核图中清楚地看到这一点)。在这种情况下,卷积3个均匀分布的集成并不是太差,所以如果需要PDF,解析地找到PDF可能是首选。否则,经验方法(特别是对于生成)可能就足够了,尽管这取决于您的应用程序。

代码语言:javascript
复制
pdt_kernel = truncate(pd_kernel,9,16)

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56757485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档