Случайно сгруппированные данные
Если ожидается, что ваши данные не будут находиться рядом с линией или плоскостью, просто вычислите расстояние от каждой точки до центроида:
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