Как найти изменчивость набора декартовых точек (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) и так далее. Я хотел найти вариабельность всех записанных точек.

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


person Smiley    schedule 15.04.2014    source источник
comment
Итак, вам просто нужно среднеквадратичное расстояние от всех записанных точек до нужной точки, или вас интересует трехмерная линия или плоскость, до которой вы можете вычислить расстояние?   -  person chappjc    schedule 15.04.2014
comment
Вы только что подняли хороший вопрос, определение среднеквадратичного расстояния от всех записанных до желаемой точки - это один из способов определения изменчивости. К сожалению, я только что понял, что у меня нет точной желаемой точки, поэтому я предполагаю, что трехмерная линия для вычисления расстояния будет лучше - то есть это расстояние будет ошибкой - могу ли я назвать эту изменчивость также?   -  person Smiley    schedule 15.04.2014
comment
Вскоре я опубликую решение с наиболее подходящей 3D-линией. Называйте это ошибкой или изменчивостью, если вы знаете, на что это указывает. Кстати, расширение ответа на другой вопрос напрямую, как это сделал Дэвид, соответствует плоскости, а не линии, хотя это вариант.   -  person chappjc    schedule 15.04.2014
comment
Или вы можете просто вычислить расстояния до центроида точек, но если вы ожидаете, что они будут вдоль линии, тогда я бы поместил линию.   -  person chappjc    schedule 15.04.2014
comment
@chappjc - я не ожидаю, что они будут вдоль линии, поэтому вычисление расстояния до центроида точек имеет больше смысла. Каждый день узнаю что-то новое!   -  person Smiley    schedule 16.04.2014
comment
Хорошо, позвольте мне обновить свой ответ, чтобы я мог кое-что извлечь из этого. Но, по крайней мере, ответы являются хорошими рекомендациями для соответствующих вакансий! :)   -  person chappjc    schedule 16.04.2014
comment
ОК, обновил. Надеюсь, это пригодится. Возможно, вопрос можно отредактировать так, чтобы поиск чего-то вроде подгонки / расстояния до 3D-линии и / или плоскости указывал на вопрос. Таким образом, ответы Дэвида и мои могут быть полезны в будущем.   -  person chappjc    schedule 16.04.2014
comment
@chappjc, ты очень полезен! Я изменил вопрос, так что надеюсь, что так лучше. Хотел бы я проголосовать за оба ответа, но у меня недостаточно репутации. Когда я это сделаю, я сделаю это!   -  person Smiley    schedule 17.04.2014


Ответы (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, как в связанном вопросе.

person David    schedule 15.04.2014
comment
Могут ли координаты xyz работать для Ax = b? Мне действительно нужно пересмотреть мою линейную алгебру, но я пытаюсь понять, что вы сделали. Почему вы выбрали именно такую ​​А? Какой метод вы здесь использовали? Спасибо - person Smiley; 15.04.2014
comment
@ Смайли, я думаю, он хотел иметь b = z_vals;. Я считаю, что это решение подойдет для всех данных. - person chappjc; 15.04.2014
comment
@Smiley Ага, парень прав, я должен был иметь b=z_vals;. Таким образом вы можете сопоставить множество типов уравнений, а не только одномерные линейные, например: en.wikipedia. org / wiki / Vandermonde_matrix # Applications - person David; 16.04.2014
comment
Большое спасибо! Ваш ответ и ответ @chappjc очень полезны! Я мог бы использовать оба. - person Smiley; 17.04.2014

Случайно сгруппированные данные

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

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-линии:

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

Данные о 3D-плоскости

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

person chappjc    schedule 15.04.2014
comment
Я распечатал это и ответ Дэвида. Мне нравится, как вы это организовали. Тебе стоит написать книгу! - person Smiley; 17.04.2014