1

所以我在看这个问题:

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)等等。我希望能够找到所有记录点的可变性。

我愿意接受任何其他建议。

4

2 回答 2

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

大卫的回答

于 2014-04-15T18:45:03.297 回答
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像在链接的问题中一样使用。

于 2014-04-15T03:37:33.043 回答