Эллипс вокруг данных в MATLAB
Я хотел бы воспроизвести следующий рисунок в MATLAB:
![exampleee.png]()
Существует два класса точек с координатами X и Y. Я хотел бы окружить каждый класс эллипсом одним параметром стандартного отклонения, который определяет, как далеко будет проходить эллипс вдоль оси.
Рисунок был создан с другим программным обеспечением, и я точно не понимаю, как он вычисляет эллипс.
Вот данные, которые я использую для этой цифры. Первый столбец - это класс, второй - X, третий - 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))
FYI, здесь - это вопрос о том, как рисовать эллипс. Итак, нам просто нужно знать все параметры для его рисования.
Update:
Я согласен, что центр можно рассчитать как средство координат X и Y. Вероятно, я должен использовать анализ основных компонентов (PRINCOMP
) для каждого класса для определения угла и формы. Все еще думая...
Ответы
Ответ 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
![screenshot]()
ИЗМЕНИТЬ
Если вы хотите, чтобы эллипс представлял определенный уровень стандартного отклонения, правильным способом является масштабирование матрицы ковариации:
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]()
Ответ 2
Я бы попробовал следующий подход:
- Рассчитайте центр тяжести x-y для центра эллипса (x, y в связанном вопросе)
- Вычислите линию линейной регрессии, чтобы получить ориентацию большой оси эллипса (угол)
- Вычислить стандартное отклонение по осям x и y
- Переведите стандартные отклонения x-y, чтобы они были ортогональны линии подгонки (a, b)
Ответ 3
Я предполагаю, что в одной матрице имеется только один набор точек, например
B = A(1:10,2:3);
вы можете воспроизвести эту процедуру для каждого набора данных.
- Вычислить центр эллипсоида, который является средним для точек. Функция Matlab:
mean
- Центрируйте свои данные. Функция Matlab
bsxfun
- Вычислить главную ось эллипсоида и соответствующую величину. Функция Matlab:
eig
Следующие шаги показаны ниже:
Center = mean(B,1);
Centered_data = bsxfun(@minus,B,Center);
[AX,MAG] = eig(Centered_data' * Centered_data);
Столбцы AX содержат векторы, описывающие основную ось эллипсоида, а диагональ MAG содержит информацию об их величине.
Чтобы построить эллипсоид, масштабируйте каждую главную ось с квадратным корнем от ее величины.
Надеюсь, что это поможет.
а.