2010-08-05 3 views
15

Ich mag würde die folgende Abbildung in MATLAB reproduzieren:Ellipse um die Daten in MATLAB

exampleee.png

Es gibt zwei Klassen von Punkten mit X und Y-Koordinaten. Ich möchte jede Klasse mit einer Ellipse mit einem Parameter der Standardabweichung umgeben, die bestimmt, wie weit die Ellipse entlang der Achse verlaufen wird.

Die Figur wurde mit einer anderen Software erstellt und ich verstehe nicht genau, wie sie die Ellipse berechnet.

Hier sind die Daten, die ich für diese Figur verwende. Die erste Spalte ist Klasse, 2. - X, 3. - Y. Ich kann gscatter verwenden, um die Punkte selbst zu zeichnen.

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

FYI, ist here die SO Frage, wie Ellipse zu zeichnen. Also müssen wir nur alle Parameter kennen, um es zu zeichnen.


Update:

I darüber einig, dass der Mittelpunkt kann als das Mittel der X- und Y-Koordinaten berechnet werden. Wahrscheinlich muss ich die Hauptkomponentenanalyse (PRINCOMP) für jede Klasse verwenden, um den Winkel und die Form zu bestimmen. Immer noch denkt ...

+0

Auch wenn Sie nicht wissen, wie die Ellipse in der ursprünglichen Abbildung berechnet wird, könnte man wahrscheinlich erklären, ein wenig mehr, was es bedeuten soll? Es umgibt nicht nur die Punkte, sondern auch die grauen Punkte, zum Beispiel sind nicht alle Punkte in der Ellipse enthalten. Wenn Sie nichts wissen, würde ich das Barycenter der Punkte als Mittelpunkt der Ellipse als Ausgangspunkt vorschlagen. Der zweite Moment der Fläche könnte Ihnen die Richtung der Hauptachse geben. – groovingandi

+0

@groovingandi: Grundsätzlich bedeutet es, wenn die Ellipse mit der Standardabweichung 3 gezeichnet wird, mit normaler Verteilung etwa 99% der Datenpunkte. Die Ellipsen auf der Figur wurden mit STD = 2 erzeugt. – yuk

Antwort

17

Betrachten Sie den Code:

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


EDIT

Wenn Sie die Ellipse wollen ein bestimmtes Niveau der Standardabweichung stellen, die richtige Vorgehensweise ist die Skalierung der Kovarianzmatrix:

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

+0

Sie können auch das Demo-Skript "eigshow" in MATLAB ausprobieren: http://www.mathworks.com/company/newsletters/news_notes/clevescorner/win98cleve.html – Amro

+0

Das ist großartig. Ich danke dir sehr. Ich wusste nicht viel, wie man Eigenvektor/Eigenwerte benutzt, aber jetzt kann ich klar sehen, wie das funktioniert. Die kleine Sache. Wenn ich deinen Code ausführe, bekomme ich kleinere Ellipsen. Wenn ich 'STD = 2 mache; VV = V * sqrt (D) * STD; ', die Ellipsen haben die gleiche Größe wie auf Ihrem und meinem ursprünglichen Plot. Ist es richtig? Entspricht dieser Multiplikator wirklich dem, was die andere Software (ich habe die ursprüngliche Figur gezeichnet) Standardabweichung nennt? – yuk

+1

@yuk: Sie haben Recht mit der obigen Abbildung, aber die korrekte Vorgehensweise besteht darin, die Kovarianzmatrix zu skalieren. Bitte sehen Sie meine Bearbeitung über – Amro

2

ich den folgenden Ansatz würde versuchen:

  1. den xy-Schwerpunkt für das Zentrum der Ellipse berechnen (x, y in den linked question)
  2. die Anpassungslinie lineare Regression berechnen die Orientierung der Ellipse die Hauptachse (Winkel)
  3. berechnen der Standardabweichung in der x zu erhalten und y-Achsen
  4. der XY-Standardabweichungen Übersetzen, so dass sie an der Passlinie orthogonal sind (a, b)
+0

Möchten Sie den Downvote erklären? Gibt es etwas konzeptionell falsch mit meinem Ansatz? – Doresoom

+0

War ich nicht. Ich denke immer noch darüber nach, wie ich es umsetzen kann. – yuk

+0

Dieser Ansatz würde ein ähnlich aussehendes (aber nicht identisches) Ergebnis liefern. Es gibt große Unterschiede zwischen einer linearen Regression, bei der die Abweichung nur auf der y-Achse berücksichtigt wird, und dem Eigenvektor. Es ist möglich, dass die Berechnung der linearen Regression, das Drehen der Daten und die Wiederholung dieses Prozesses zu einem identischen Ergebnis führt. Dies würde die Summe der Quadrate entlang einer Achse senkrecht zu der Regressionslinie anstatt nur auf der Y-Achse minimieren. –

1

Ich nehme an, es gibt nur einen Satz von Punkten in einer einzigen Matrix, z.

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

Sie können diese Prozedur für jeden Datensatz reproduzieren.

  1. Berechnen Sie den Mittelpunkt des Ellipsoids, der den Mittelwert der Punkte darstellt. Matlab-Funktion: mean
  2. Zentrieren Sie Ihre Daten. Matlab-Funktion bsxfun
  3. Berechnen Sie die Hauptachse des Ellipsoids und ihre jeweilige Größe. Matlab-Funktion: eig

Die aufeinanderfolgenden Schritte sind unten dargestellt:

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

Die Spalten von AX enthalten die Vektoren die Hauptachse des Ellipsoids zu beschreiben, während die Diagonale von MAG Informationen über ihre Stärke enthält. Um das Ellipsoid zu zeichnen, skalieren Sie jede Hauptachse mit der Quadratwurzel ihrer Größe.

Hoffe, das hilft.

A.