【问题标题】:Holes in gaussian mixture plot高斯混合图中的孔
【发布时间】:2014-04-12 04:05:37
【问题描述】:

我正在尝试使用 matlab 绘制高斯混合模型。我正在使用以下代码/数据:

p = [0.048544095760874664 , 0.23086205172287944 , 0.43286598287228106 ,0.1825503345829704 , 0.10517753506099443];

meanVectors(:,1) = [1.3564375381318807 , 5.93145751073734];
meanVectors(:,2) = [3.047518052924292 , 3.0165339699001463];
meanVectors(:,3) = [7.002335595122265 , 6.02432823594635];
meanVectors(:,4) = [6.990841095715846 , 3.5056707068971438];
meanVectors(:,5) = [6.878912868397179 , 1.1054191293515965];

covarianceMatrices(:,:,1) = [1.3075839191466305 0.07843065902827488; 0.07843065902827488 0.3167448334937619];
covarianceMatrices(:,:,2) = [0.642914957488056 0.15638677636129855; 0.15638677636129852 0.382240356677974];
covarianceMatrices(:,:,3) = [0.8216051423486987 0.15225179380145448; 0.15225179380145445 0.37030472711188295];
covarianceMatrices(:,:,4) = [1.064002437166605 0.11798234162403692; 0.11798234162403692 0.2687495955430368];
covarianceMatrices(:,:,5) = [0.6445011493286044 0.15295220981440236; 0.1529522098144023 0.5231676196736254];

obj = gmdistribution(meanVectors', covarianceMatrices, p);

figure(1);
ezcontour(@(x,y)pdf(obj,[x y]), [-10 10], [-10 10]);

figure(2);
ezsurf(@(x,y)pdf(obj,[x y]), [-10 10], [-10 10]);

但生成的表面看起来真的很“尖锐”。我是不是做错了什么?

【问题讨论】:

    标签: matlab gaussian


    【解决方案1】:

    似乎问题在于绘制函数 这段代码要慢得多,但对我有用

    p = [0.048544095760874664 , 0.23086205172287944 , 0.43286598287228106 ,0.1825503345829704 , 0.10517753506099443];
    
    meanVectors(:,1) = [1.3564375381318807 , 5.93145751073734];
    meanVectors(:,2) = [3.047518052924292 , 3.0165339699001463];
    meanVectors(:,3) = [7.002335595122265 , 6.02432823594635];
    meanVectors(:,4) = [6.990841095715846 , 3.5056707068971438];
    meanVectors(:,5) = [6.878912868397179 , 1.1054191293515965];
    
    covarianceMatrices(:,:,1) = [1.3075839191466305 0.07843065902827488; 0.07843065902827488 0.3167448334937619];
    covarianceMatrices(:,:,2) = [0.642914957488056 0.15638677636129855; 0.15638677636129852 0.382240356677974];
    covarianceMatrices(:,:,3) = [0.8216051423486987 0.15225179380145448; 0.15225179380145445 0.37030472711188295];
    covarianceMatrices(:,:,4) = [1.064002437166605 0.11798234162403692; 0.11798234162403692 0.2687495955430368];
    covarianceMatrices(:,:,5) = [0.6445011493286044 0.15295220981440236; 0.1529522098144023 0.5231676196736254];
    
    obj = gmdistribution(meanVectors', covarianceMatrices, p);
    
    x = -10:.2:10; y = x; n=length(x); a=zeros(n,n);
    for i = 1:n, for j = 1:n, a(i,j) = pdf(obj,[x(i) y(j)]); end, end;
    surf(x,y,a,'FaceColor','interp','EdgeColor','none','FaceLighting','phong')
    

    【讨论】:

    • 在某些情况下,仅仅增加网格大小是行不通的。您提供的算法虽然速度较慢,但​​每次都有效。
    【解决方案2】:

    问题在于默认的网格大小,即60。设置一个更大的数字,你会得到预期的结果:

    figure(1);
    ezcontour(@(x,y)pdf(obj,[x y]), [-10 10], [-10 10],300);
    
    figure(2);
    ezsurf(@(x,y)pdf(obj,[x y]), [-10 10], [-10 10],300);
    

    【讨论】:

    • 这似乎是一个不同的问题。当我运行 OP 代码时,在我的 matlab 版本 2012b 中,在某些时候绘图是空的。就像 ezsurf 没有正确绘制 pdf 的返回值(即使您增加了网格点的数量)。 OP 代码对你有用吗?
    • 这解决了 ezsurf 的问题,但增加 ezcontour() 的网格大小会导致较弱的组件从图中消失。
    • @sebas:给定网格大小为 100,表面图相当不错。
    • @AlexGaspare:较弱的组件消失了,因为较小的网格找到了更高的最大值。线条在最小值和最大值之间均匀分布,我不知道有任何影响这种行为的可能性。
    • @Daniel:你能推荐一个 ezcontour 的替代品吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 2021-09-30
    • 2018-01-30
    • 2015-09-12
    • 2012-12-20
    • 2016-09-16
    • 2015-04-10
    • 2014-01-14
    相关资源
    最近更新 更多