随机聚类数据
如果您的数据预计不会靠近线或平面,只需计算每个点到质心的距离:
xyz_bar = mean(xyz);
M = bsxfun(@minus,xyz,xyz_bar);
d = sqrt(sum(M.^2,2)); % distances to centroid
然后,您可以随心所欲地计算可变性。例如,标准偏差和 RMS 误差:
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))
现在您有了从每个点到拟合线的距离(每个点的“误差”)。您可以计算平均值、RMS、标准偏差等:
>> std(errs)
ans =
0.3232
>> sqrt(mean(errs.^2))
ans =
0.7017
关于 3D 平面的数据
见大卫的回答。