代码之家  ›  专栏  ›  技术社区  ›  yuk

MATLAB中数据的椭圆化

  •  15
  • yuk  · 技术社区  · 15 年前

    我想在MATLAB中重现下图:

    exampleee.png

    有两类具有X和Y坐标的点。我想用一个椭圆来包围每个类,这个椭圆有一个标准偏差参数,这个参数决定椭圆沿着轴走多远。

    这个图形是用另一个软件创建的,我不太明白它是如何计算椭圆的。

    这是我用来计算这个数字的数据。第一列是class,2nd-X,3rd-Y。我可以用 gscatter

    A = [
        0   0.89287 1.54987
        0   0.69933 1.81970
        0   0.84022 1.28598
        0   0.79523 1.16012
        0   0.61266 1.12835
        0   0.39950 0.37942
        0   0.54807 1.66173
        0   0.50882 1.43175
        0   0.68840 1.58589
        0   0.59572 1.29311
        1   1.00787 1.09905
        1   1.23724 0.98834
        1   1.02175 0.67245
        1   0.88458 0.36003
        1   0.66582 1.22097
        1   1.24408 0.59735
        1   1.03421 0.88595
        1   1.66279 0.84183
    ];
    
    gscatter(A(:,2),A(:,3),A(:,1))
    

    仅供参考, here 问题是如何画椭圆。所以,我们只需要知道绘制它的所有参数。


    我同意中心可以用X和Y坐标的平均值来计算。可能我得用主成分分析法( PRINCOMP )为每个类确定角度和形状。还在想。。。

    3 回复  |  直到 9 年前
        1
  •  17
  •   Amro    10 年前

    考虑代码:

    %# generate data
    num = 50;
    X = [ mvnrnd([0.5 1.5], [0.025 0.03 ; 0.03 0.16], num) ; ...
          mvnrnd([1 1], [0.09 -0.01 ; -0.01 0.08], num)   ];
    G = [1*ones(num,1) ; 2*ones(num,1)];
    
    gscatter(X(:,1), X(:,2), G)
    axis equal, hold on
    
    for k=1:2
        %# indices of points in this group
        idx = ( G == k );
    
        %# substract mean
        Mu = mean( X(idx,:) );
        X0 = bsxfun(@minus, X(idx,:), Mu);
    
        %# eigen decomposition [sorted by eigen values]
        [V D] = eig( X0'*X0 ./ (sum(idx)-1) );     %#' cov(X0)
        [D order] = sort(diag(D), 'descend');
        D = diag(D);
        V = V(:, order);
    
        t = linspace(0,2*pi,100);
        e = [cos(t) ; sin(t)];        %# unit circle
        VV = V*sqrt(D);               %# scale eigenvectors
        e = bsxfun(@plus, VV*e, Mu'); %#' project circle back to orig space
    
        %# plot cov and major/minor axes
        plot(e(1,:), e(2,:), 'Color','k');
        %#quiver(Mu(1),Mu(2), VV(1,1),VV(2,1), 'Color','k')
        %#quiver(Mu(1),Mu(2), VV(1,2),VV(2,2), 'Color','k')
    end
    

    screenshot


    如果希望椭圆表示特定水平的标准偏差,正确的方法是缩放协方差矩阵:

    STD = 2;                     %# 2 standard deviations
    conf = 2*normcdf(STD)-1;     %# covers around 95% of population
    scale = chi2inv(conf,2);     %# inverse chi-squared with dof=#dimensions
    
    Cov = cov(X0) * scale;
    [V D] = eig(Cov);
    

    OP_DATA

        2
  •  2
  •   Community Mohan Dere    9 年前

    我会尝试以下方法:

    1. 计算椭圆中心的x-y形心 linked question )
    2. 计算线性回归拟合线以获得椭圆长轴的方向(角度)
    3. 计算x和y轴上的标准偏差
    4. 平移x-y标准偏差,使其与拟合线(a,b)正交
        3
  •  1
  •   Adrien    15 年前

    我假设在一个矩阵中只有一组点,例如。

    B = A(1:10,2:3);
    

    您可以为每个数据集重现此过程。

    1. 计算椭球体的中心,即点的平均值。Matlab函数: mean
    2. 集中你的数据。Matlab函数 bsxfun
    3. 计算椭球体的主轴和它们各自的大小。Matlab函数: eig

    Center = mean(B,1);
    Centered_data = bsxfun(@minus,B,Center);
    [AX,MAG] = eig(Centered_data' * Centered_data);
    

    要绘制椭球体,请使用其大小的平方根缩放每个主轴。

    希望这有帮助。