16

次の図を MATLAB で再現したいと思います。

たとえばee.png

X 座標と Y 座標を持つ点には 2 つのクラスがあります。各クラスを楕円で囲み、標準偏差の 1 つのパラメーターを使用して、楕円が軸に沿ってどれだけ移動するかを決定します。

この図は別のソフトウェアで作成されたもので、楕円の計算方法がよくわかりません。

この図に使用しているデータは次のとおりです。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))

参考までに、楕円を描く方法に関するSOの質問は次のとおりです。したがって、それを描画するためのすべてのパラメーターを知る必要があります。


アップデート:

中心は X 座標と Y 座標の平均として計算できることに同意します。PRINCOMPおそらく、角度と形状を決定するには、クラスごとに主成分分析 ( ) を使用する必要があります。まだ考えています...

4

3 に答える 3

17

次のコードを検討してください。

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

OP_DATA

于 2010-08-05T23:33:27.043 に答える
2

次のアプローチを試してみます。

  1. 楕円の中心の xy 重心を計算します (リンクされた質問の x,y )
  2. 線形回帰適合線を計算して、楕円の長軸 (角度) の方向を取得します。
  3. x 軸と y 軸の標準偏差を計算します
  4. xy 標準偏差を変換して、適合線 (a,b) に直交するようにします。
于 2010-08-05T19:07:35.040 に答える
1

単一のマトリックスで指定されたポイントのセットは1つだけであると仮定します。

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

この手順は、データ セットごとに再現できます。

  1. ポイントの平均である楕円体の中心を計算します。マトラブ関数:mean
  2. データを中央に配置します。マトラブ関数bsxfun
  3. 楕円体の主軸とそれぞれの大きさを計算します。マトラブ関数:eig

一連の手順を以下に示します。

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

AX の列には楕円体の主軸を表すベクトルが含まれ、MAG の対角線にはその大きさに関する情報が含まれます。楕円体をプロットするには、各主軸をその大きさの平方根でスケーリングします。

お役に立てれば。

A.

于 2010-08-05T21:07:22.667 に答える