转换将Matlab中的高斯混合绘制成均匀的

时间:2017-07-24 12:07:37

标签: matlab random

在Matlab中考虑以下对2x1向量的绘制,其概率分布是两个高斯分量的混合。

P=10^3; %number draws
v=1;

%First component
mu_a = [0,0.5];
sigma_a = [v,0;0,v];

%Second component
mu_b = [0,8.2];
sigma_b = [v,0;0,v];


%Combine    
MU = [mu_a;mu_b];
SIGMA = cat(3,sigma_a,sigma_b);
w = ones(1,2)/2; %equal weight 0.5
obj = gmdistribution(MU,SIGMA,w);

%Draws
RV_temp = random(obj,P);%Px2

% Transform each component of RV_temp into a uniform in [0,1] by estimating the cdf.
RV1=ksdensity(RV_temp(:,1), RV_temp(:,1),'function', 'cdf');
RV2=ksdensity(RV_temp(:,2), RV_temp(:,2),'function', 'cdf'); 

现在,如果我们通过

检查RV1RV2是否均匀分布在[0,1]
ecdf(RV1)
ecdf(RV2)

我们可以看到RV1均匀分布在[0,1]上(经验cdf接近45度线),而RV2则不然。

我不明白为什么。似乎mu_a(2)mu_b(2)越远,ksdensity以合理的抽奖次数完成的工作就越差。为什么呢?

2 个答案:

答案 0 :(得分:2)

当你有N(0.5,v)和N(8.2,v)的混合时,生成数据的范围大于你期望的更近,如N(0,v)和N( 0,v),就像你在另一个维度中一样。然后你要求ksdensity使用此范围内的P点来近似函数。

与标准线性插值一样,点越密越,函数的近似值越好(在范围内),这就是相同的情况。因此,在N(0.5,v)和N(8.2,v)中,点是“稀疏的”(或更稀疏,是一个词?),近似值比N(0,v)和N(0)更差。 ,v)这些点更密集。

作为一个小旁注,您是否有任何理由不直接在双变量数据上应用ksdensity?另外,如果您说5e2分也很好,我也无法重现您的评论。最终评论1e3通常优先于10^3

答案 1 :(得分:0)

我认为这只是你正在使用的样本数量。对于第一个例子,两个高斯的平均值相对较近,因此有一千个样本足以获得一个非常接近U [0,1] cdf的cdf。但是,在第二个矢量上,您有更高的差异,需要更多样本。有了100000个样本,我得到了以下结果:

Result with 100000 Samples

我用1000获得了这个:

Result with 1000 Samples

这显然远离Uniform cdf功能。尝试将样本数量增加到一百万,并检查结果是否再次接近。