2010-08-05 33 views
15

Tôi muốn để tái tạo hình sau trong MATLAB:Ellipse xung quanh các dữ liệu trong MATLAB

exampleee.png

Có hai loại điểm với X và Y tọa độ. Tôi muốn bao quanh mỗi lớp với một hình elip với một tham số của độ lệch chuẩn, trong đó xác định khoảng cách hình elip sẽ đi dọc theo trục.

Hình này được tạo bằng phần mềm khác và tôi không hiểu chính xác cách tính toán hình elip.

Đây là dữ liệu tôi đang sử dụng cho hình này. Cột thứ nhất là lớp, 2 - X, 3 - Y. Tôi có thể sử dụng gscatter để vẽ các điểm chính nó.

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 là câu hỏi SO về cách vẽ hình elip. Vì vậy, chúng ta chỉ cần biết tất cả các tham số để vẽ nó.


Cập nhật:

Tôi đồng ý rằng trung tâm có thể được tính như các phương tiện X và Y tọa độ. Có lẽ tôi phải sử dụng phân tích thành phần chính (PRINCOMP) cho mỗi lớp để xác định góc và hình dạng. Vẫn nghĩ ...

+0

Thậm chí nếu bạn không biết làm thế nào hình elip ở con số ban đầu được tính, bạn có thể có thể giải thích một chút hơn những gì nó là vụ phải nghĩa là gì? Nó không chỉ xung quanh các điểm như cho các điểm màu xám ví dụ, không phải tất cả các điểm được bao gồm trong hình elip. Nếu bạn không biết bất cứ điều gì, tôi sẽ đề nghị các trung tâm của các điểm là trung tâm của hình elip như là một điểm khởi đầu. Khoảnh khắc thứ hai của khu vực có thể cho bạn hướng trục chính. – groovingandi

+0

@groovingandi: Về cơ bản nó có nghĩa là, nếu hình elip được vẽ với độ lệch chuẩn 3, với phân phối bình thường, nó sẽ bao gồm khoảng 99% điểm dữ liệu. Hình elip trên hình đã được tạo ra với STD = 2. – yuk

Trả lời

17

xem xét mã:

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

Nếu bạn muốn hình elip để đại diện cho một mức độ cụ thể của độ lệch chuẩn, chính xác cách làm là bằng cách mở rộng ma trận hiệp phương sai:

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

Ngoài ra, bạn có thể muốn kiểm tra kịch bản demo 'eigshow' trong MATLAB: http://www.mathworks.com/company/newsletters/news_notes/clevescorner/win98cleve.html – Amro

+0

Điều này thật tuyệt. Cảm ơn bạn rất nhiều. Tôi không biết làm thế nào để sử dụng eigenvector/eigenvalues, nhưng bây giờ tôi có thể thấy rõ cách thức hoạt động của công cụ này. Điều nhỏ nhặt. Nếu tôi chạy mã của bạn, tôi nhận được hình elip nhỏ hơn. Nếu tôi làm 'STD = 2; VV = V * sqrt (D) * STD; ', hình elip có cùng kích thước với âm mưu ban đầu và của bạn. Nó có đúng không? Hệ số này có thực sự tương ứng với phần mềm khác (tôi đã sử dụng để vẽ hình gốc) gọi là độ lệch chuẩn không? – yuk

+1

@yuk: bạn nói đúng về hình trên, nhưng cách làm đúng là bằng cách mở rộng ma trận hiệp phương sai. Vui lòng xem chỉnh sửa của tôi ở trên – Amro

2

Tôi muốn thử những phương pháp sau đây:

  1. Tính trọng tâm xy cho trung tâm của elip (x, y trong linked question)
  2. Tính hồi quy tuyến tính phù hợp dòng để có được những định hướng của trục lớn của elip (góc)
  3. Tính độ lệch chuẩn trong x và y trục
  4. Dịch độ lệch chuẩn xy vì vậy họ đang trực giao với dòng phù hợp (a, b)
+0

Chăm sóc để giải thích các downvote? Có điều gì đó sai về mặt khái niệm với cách tiếp cận của tôi không? – Doresoom

+0

Không phải là tôi. Tôi vẫn đang nghĩ cách thực hiện nó. – yuk

+0

Cách tiếp cận này sẽ cho kết quả tìm kiếm tương tự (nhưng không giống hệt). Có sự khác biệt lớn giữa hồi quy tuyến tính, trong đó độ lệch chỉ trong trục y được xem xét và Eigenvector. Có thể tính toán hồi quy tuyến tính, xoay dữ liệu và lặp lại quá trình này sẽ mang lại kết quả giống nhau. Điều này sẽ giảm thiểu tổng các bình phương dọc theo trục vuông góc với đường hồi quy thay vì chỉ ở trục y. –

1

Tôi giả sử chỉ có một tập hợp các điểm được đưa ra trong một ma trận, ví dụ:

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

bạn có thể tạo lại quy trình này cho từng tập dữ liệu.

  1. Tính trung tâm của ellipsoid, là điểm trung bình của các điểm. Chức năng Matlab: mean
  2. Căn giữa dữ liệu của bạn. Chức năng Matlab bsxfun
  3. Tính toán trục chính của elipsoid và độ lớn tương ứng của chúng. Matlab chức năng: eig

Các bước tiếp được minh họa dưới đây:

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

Các cột của AX chứa các vectơ mô tả trục chính của elipsoid trong khi đường chéo của MAG chứa thông tin về tầm quan trọng của họ. Để vẽ hình elipsoid, hãy chia tỷ lệ mỗi trục chính với căn bậc hai của độ lớn của nó.

Hy vọng điều này sẽ hữu ích.

A.

Các vấn đề liên quan