2010-08-05 40 views
15

que me gustaría reproducir la siguiente figura en MATLAB:elipse alrededor de los datos en MATLAB

exampleee.png

Hay dos clases de puntos con coordenadas X e Y. Me gustaría rodear cada clase con una elipse con un parámetro de desviación estándar, que determina qué tan lejos irá la elipse a lo largo del eje.

La figura se creó con otro software y no entiendo exactamente cómo se calcula la elipse.

Aquí están los datos que estoy usando para esta figura. La primera columna es class, 2nd - X, 3rd - Y. Puedo usar gscatter para dibujar los puntos.

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, here es la pregunta SO sobre cómo dibujar una elipse. Entonces, solo necesitamos saber todos los parámetros para dibujarlo.


Actualización:

Estoy de acuerdo que el centro se puede calcular como el medio de las coordenadas X e Y. Probablemente tengo que usar el análisis del componente principal (PRINCOMP) para cada clase para determinar el ángulo y la forma. Aún pensando ...

+0

Incluso si usted no sabe cómo se calcula la elipse en la figura original, que probablemente podría explicar un poco más todo lo que se supone que significa? No solo rodea los puntos como los puntos grises, por ejemplo, no todos los puntos están incluidos en la elipse. Si no sabe nada, sugeriría el baricentro de los puntos como el centro de la elipse como punto de partida. El segundo momento del área podría darle la dirección del eje principal. – groovingandi

+0

@groovingandi: Básicamente significa que, si la elipse se dibuja con la desviación estándar 3, con distribución normal, incluirá aproximadamente el 99% de los puntos de datos. Las elipses en la figura se generaron con STD = 2. – yuk

Respuesta

17

Considere el código:

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


EDITAR

Si desea que la elipse para representar un determinado nivel de desviación estándar, la correcta La forma de hacerlo es escalando la matriz de covarianza:

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

Además, es posible que desee consultar el guión de demostración 'eigshow' en MATLAB: http://www.mathworks.com/company/newsletters/news_notes/clevescorner/win98cleve.html – Amro

+0

Esto es genial. Muchas gracias. No sabía mucho cómo usar eigenvector/valores propios, pero ahora puedo ver claramente cómo funciona esto. Lo menor. Si ejecuto tu código, obtengo elipsis más pequeñas. Si hago 'STD = 2; VV = V * sqrt (D) * STD; ', las elipses son del mismo tamaño que en tu y mi trama original. ¿Es correcto? ¿Este multiplicador realmente corresponde a lo que el otro software (yo solía dibujar la figura original) llama desviación estándar? – yuk

+1

@yuk: tiene razón sobre la figura anterior, pero la forma correcta de hacerlo es escalando la matriz de covarianza. Consulte mi edición anterior – Amro

2

me gustaría probar el siguiente enfoque:

  1. Calcular el centroide xy para el centro de la elipse (x, y en el linked question)
  2. Calcular la línea de ajuste de regresión lineal para obtener la orientación del eje mayor de la elipse (ángulo)
  3. calcular la desviación estándar en el eje X y y
  4. traducir las desviaciones estándar xy por lo que son ortogonales a la línea de ajuste (a, b)
+0

¿Cuidar para explicar el voto a favor? ¿Hay algo conceptualmente mal con mi enfoque? – Doresoom

+0

No era yo. Todavía estoy pensando cómo implementarlo. – yuk

+0

Este enfoque daría un resultado similar (pero no idéntico). Hay grandes diferencias entre una regresión lineal, donde se considera la desviación solo en el eje y, y el vector propio. Es posible que calcular la regresión lineal, rotar los datos y repetir este proceso arroje un resultado idéntico. Esto sería minimizar la suma de cuadrados a lo largo de un eje perpendicular a la línea de regresión en lugar de solo en el eje y. –

1

Supongo que solo hay un conjunto de puntos en una sola matriz, p.

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

puede reproducir este procedimiento para cada conjunto de datos.

  1. Calcule el centro del elipsoide, que es la media de los puntos. Función de Matlab: mean
  2. Centre sus datos. Función Matlab bsxfun
  3. Calcule el eje principal del elipsoide y su magnitud respectiva. función Matlab: eig

se ilustran a continuación los pasos sucesivos:

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

Las columnas de AX contiene los vectores que describen el eje principal de la elipsoide mientras que la diagonal de MAG contiene información sobre su magnitud. Para trazar el elipsoide, escale cada eje principal con la raíz cuadrada de su magnitud.

Espero que esto ayude.

A.

Cuestiones relacionadas