Как найти изменчивость набора декартовых точек (xyz) или примерки / расстояния до 3D-линии и / или плоскости?

Итак, я смотрел на этот вопрос:

Matlab - стандартное отклонение декартовых точек

Который в основном отвечает на мой вопрос, кроме проблемы, у меня есть xyz, а не xy. Так что я не думаю, что Ax=b сработает в этом случае.


У меня есть, скажем, 10 декартовых точек, и я хочу найти стандартное отклонение этих точек. Теперь я не хочу стандартное отклонение каждого X, Y и Z (в результате 3 набора), но я просто хочу получить одно число.

Это можно сделать с помощью MATLAB или Excel.


Чтобы лучше понять, что я делаю, у меня есть этот желаемый пункт (1,2,3), и я записал (1.1,2.1,2.9), (1.2,1.9,3.1) и так далее. Я хотел быть в состоянии найти изменчивость всех записанных точек.

Я открыт для любых других предложений.

2 ответа

Если вы делаете то же самое, что и в другом ответе, который вы указали, это должно сработать.

x_vals = xyz(:,1);
y_vals = xyz(:,2);
z_vals = xyz(:,3);

затем сделать A с 3 колонками,

A = [x_vals y_vals ones(size(x_vals))];

а также

b = z_vals;

затем

sol=A\b;
m = sol(1);
n = sol(2);
c = sol(3);

а потом

errs = (m*x_vals + n*y_vals + c) - z_vals;

После этого вы можете использовать errs так же, как в связанном вопросе.

Случайно кластеризованные данные

Если ваши данные не должны находиться вблизи линии или плоскости, просто рассчитайте расстояние каждой точки до центроида:

xyz_bar = mean(xyz);
M = bsxfun(@minus,xyz,xyz_bar);
d = sqrt(sum(M.^2,2)); % distances to centroid

Тогда вы можете вычислить изменчивость так, как вам нравится. Например, стандартное отклонение и среднеквадратическая ошибка:

std(d)
sqrt(mean(d.^2))

Данные о 3D-линии

Если ожидается, что точки данных будут приблизительно вдоль пути линии с некоторым отклонением от нее, вы можете посмотреть на расстояние до линии наилучшего соответствия. Сначала подгоните 3D-линию к вашим точкам. Одним из способов является использование следующей параметрической формы 3D-линии:

x = a*t + x0
y = b*t + y0
z = c*t + z0

Сгенерируйте некоторые тестовые данные с шумом:

abc = [2 3 1]; xyz0 = [6 12 3];
t = 0:0.1:10;
xyz = bsxfun(@plus,bsxfun(@times,abc,t.'),xyz0) + 0.5*randn(numel(t),3)
plot3(xyz(:,1),xyz(:,2),xyz(:,3),'*') % to visualize

Оцените параметры 3D-линии:

xyz_bar = mean(xyz) % centroid is on the line
M = bsxfun(@minus,xyz,xyz_bar); % remove mean
[~,S,V] = svd(M,0)
abc_est = V(:,1).'
abc/norm(abc) % compare actual slope coefficients

Расстояние от точек до 3D-линии:

pointCentroidSeg = bsxfun(@minus,xyz_bar,xyz);
pointCross = cross(pointCentroidSeg, repmat(abc_est,size(xyz,1),1));
errs = sqrt(sum(pointCross.^2,2))

Теперь у вас есть расстояние от каждой точки до линии соответствия ("ошибка" каждой точки). Вы можете вычислить среднее значение, среднеквадратическое значение, стандартное отклонение и т. Д.:

>> std(errs)
ans =
    0.3232
>> sqrt(mean(errs.^2))
ans =
    0.7017

Данные о трехмерной плоскости

Смотрите ответ Дэвида.

Другие вопросы по тегам