【问题标题】:Ellipse around the data in MATLAB在 MATLAB 中围绕数据画椭圆
【发布时间】:2010-08-05 16:40:15
【问题描述】:

我想在MATLAB中重现下图:

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

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

这是我用于此图的数据。第 1 列是类,第 2 - X,第 3 - 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 是关于如何绘制椭圆的 SO 问题。所以,我们只需要知道绘制它的所有参数。


更新:

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

【问题讨论】:

  • 即使您不知道原始图中的椭圆是如何计算的,您也可以稍微解释一下它应该是什么意思?例如,它不仅仅是围绕点,例如灰点,并非所有点都包含在椭圆中。如果您什么都不知道,我建议将点的重心作为椭圆的中心作为起点。面积的第二个时刻可以为您提供主轴的方向。
  • @groovingandi:基本上这意味着,如果椭圆以标准差 3 绘制,则在正态分布下,它将包含大约 99% 的数据点。图中的椭圆是使用 STD=2 生成的。

标签: matlab plot ellipse normal-distribution standard-deviation


【解决方案1】:

考虑代码:

%# 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


编辑

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

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

【讨论】:

  • 另外,您可能想查看 MATLAB 中的 eigshow 演示脚本:mathworks.com/company/newsletters/news_notes/clevescorner/…
  • 这很棒。非常感谢。我不太了解如何使用特征向量/特征值,但现在我可以清楚地看到这些东西是如何工作的。小事。如果我运行你的代码,我会得到更小的椭圆。如果我这样做STD = 2; VV = V*sqrt(D)*STD;,椭圆的大小与您和我的原始图上的相同。这是正确的吗?这个乘数真的对应其他软件(我用来画原图)所说的标准差吗?
  • @yuk:你对上图是对的,但正确的做法是缩放协方差矩阵。请看我上面的编辑
  • 如果有人偶然发现并想在 Excel 中实现相同的算法,我将 MatLab 示例翻译为 VBA。 (github.com/Beakerboy/VBA-Projects/blob/master/Ellipse.bas)
【解决方案2】:

我会尝试以下方法:

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

【讨论】:

  • 想解释一下否决票?我的方法在概念上是否有问题?
  • 不是我。我还在思考如何实现。
  • 这种方法会给出类似(但不相同)的结果。仅考虑 y 轴偏差的线性回归与特征向量之间存在很大差异。计算线性回归、旋转数据并重复此过程可能会产生相同的结果。这将最小化沿垂直于回归线的轴的平方和,而不是仅在 y 轴上。
  • @KevinNowaczyk 哇,我已经有一段时间没有发布这个答案了!在过去的 6 到 7 年里,我对特征向量进行了更多处理,我想说 Amro 的答案将比线性回归更有效。
  • 我只是添加了我的评论,以防其他人偶然发现这一点并认为回归会更容易。我使用您前段时间在 excel 中描述的确切过程,直到我遇到这个线程。最后我在 VBA 中复制了最佳答案。
【解决方案3】:

我假设在单个矩阵中只给出一组点,例如

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

AX 的列包含描述椭球主轴的向量,而 MAG 的对角线包含有关其大小的信息。 要绘制椭圆体,请使用其大小的平方根来缩放每个主轴。

希望这会有所帮助。

一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多