【问题标题】:How to find variability of a set of Cartesian Points (xyz) or fitting/distance to 3D line and/or plane?如何找到一组笛卡尔点 (xyz) 的可变性或与 3D 线和/或平面的拟合/距离?
【发布时间】:2014-05-29 05:34:00
【问题描述】:

所以我在看这个问题:

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

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

【问题讨论】:

  • 那么您只是想要所有记录点到所需点的 RMS 距离,还是有兴趣找到可以计算距离的 3D 线或平面?
  • 您刚刚提出了一个好点,找到所有记录到所需点的 RMS 距离是找到可变性的一种方法。不幸的是,我刚刚意识到我没有确切的期望点,所以我猜测用 3D 线来计算距离会更好——也就是说这个距离会是错误——我可以称之为可变性吗也一样?
  • 我很快就会发布一个最适合 3D 线的解决方案。只要您知道它表示什么,就将其称为错误或可变性。顺便说一句,正如大卫所做的那样,直接从另一个问题中扩展答案适合平面,而不是一条线,尽管这是一个选项。
  • 或者你可以只计算点到质心的距离,但如果你希望它们沿着一条线,那么我会拟合一条线。
  • @chappjc -- 我不希望它们沿着一条线,因此计算点到质心的距离更有意义。每天我都会学到一些新东西!

标签: excel matlab statistics standard-deviation cartesian


【解决方案1】:

随机聚类数据

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

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 线拟合到您的点。一种方法是使用以下参数形式的 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

【讨论】:

  • 我打印了这个和大卫的答案。喜欢你如何组织这个。你应该写一本书!
【解决方案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

【讨论】:

  • xyz 坐标是否适用于 Ax=b?我真的需要复习我的线性代数,但我试图理解你做了什么。为什么会选择这样的A?你这里用的是什么方法?谢谢
  • @Smiley 我相信他的本意是拥有b = z_vals;。我相信,此解决方案将适合数据平面。
  • @Smiley Yep chappjc 是正确的,我应该有b=z_vals;。您可以通过这种方式拟合多种类型的方程,而不仅仅是一维线性方程,例如:en.wikipedia.org/wiki/Vandermonde_matrix#Applications
  • 非常感谢!您的回答和@chappjc 的回答非常有帮助!我可能同时使用两者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2022-01-20
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多