如何找到一组笛卡尔点(xyz)或拟合/距离到3D线和/或平面的可变性?

时间:2014-04-15 03:05:18

标签: excel matlab statistics standard-deviation cartesian

所以我在看这个问题:

Matlab - Standard Deviation of Cartesian Points

这基本上回答了我的问题,除了问题是我有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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

随机群集数据

如果您的数据预计不在线或平面附近,只需计算每个点到质心的距离:

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平面的数据

请参阅David's answer