【问题标题】:Matlab - Standard Deviation of Cartesian PointsMatlab - 笛卡尔点的标准偏差
【发布时间】:2012-09-26 00:35:21
【问题描述】:

我有一个笛卡尔点数组(第 1 列是 x 值,第 2 列是 y 值),如下所示:

308 522
307 523
307 523
307 523
307 523
307 523
306 523

我将如何获得分数的标准差?它将与平均值进行比较,平均值是一条直线。这些点不是那条直线,因此标准差描述了线段与直线的波浪或“偏离基准”程度。

非常感谢您的帮助。

【问题讨论】:

  • 好吧,您是否需要“标准偏差”(无论如何都不是在 2D 中定义的)?因为在这种情况下更自然的是绘制一条最佳拟合线并使用 R^2 值(确定系数)来描述数据与直线的“离基”程度。
  • 你能给我一个例子来说明我将如何做到这一点吗?假设最佳拟合线在点 300,500 和 310,550 之间。
  • 对不起,额外的回复,但基本上我试图确定通过这些点的线段是直的还是弯曲的,并找到一种量化它的方法。
  • 暂时用这个,我明天再来en.wikipedia.org/wiki/Coefficient_of_determination
  • 但是,如果您的意思是通过所有这些点,R^2 是用于量化线性拟合的非精确性的标准值。如果您的意思是通过两点的弧是否弯曲,您可以根据需要将通过两点的弧弯曲,所以它没有多大意义

标签: arrays matlab statistics standard-deviation


【解决方案1】:

如果您确定xy 数据描述的是一条直线,您可以执行以下操作。

找到最佳拟合直线等于在最小二乘意义上求解超定线性系统Ax = b,其中

xy = [
308 522
307 523
307 523
307 523
307 523
307 523
306 523];

x_vals = xy(:,1);
y_vals = xy(:,2);

A = [x_vals ones(size(x_vals))];
b = y_vals;

这可以像这样在 Matlab 中完成:

sol = A\b;

m = sol(1);
c = sol(2);

我们现在所做的是找到mc 的值,以便等式y = mx+c 描述的线最适合您提供的数据。这条最适合的线并不完美,所以它有错误w.r.t。 y 数据:

errs = (m*x_vals + c) - y_vals;

这些误差的标准差可以这样计算:

>> std(errs)
ans = 
    0.2440

如果你想使用直线的垂直距离(欧几里得距离),你必须包括一个几何因子:

errs = (m*x_vals + c) - y;
errs_perpendicular = errs * cos(atan(m));

使用 trig 身份,可以将其返工为

errs_perpendicular = errs * 1/sqrt(1+m*m);

当然,

>> std(errs_perpendicular)
ans = 
    0.2182

如果您不确定直线是否适合数据和/或您的 xy 数据本质上描述了某个公共中心周围的点云,您可以执行以下操作。

找到质心(COM):

COM = mean(xy);

所有点到COM的距离:

dists = sqrt(sum(bsxfun(@minus, COM, xy).^2,2));

及其标准差:

>> std(dists)
ans =  
    0.5059

【讨论】:

  • +1 - 好答案。我唯一不同的是测量线和点之间的欧几里得距离,而不仅仅是 Y 维度上的距离
  • 非常感谢您的回答。它给了我标准偏差(我正在做直线部分)。是否更适合使用决定系数来识别直线?
  • @Andrey 想一想,上面的最小二乘拟合也是使用 y 距离完成的,所以理想情况下,如果你要使用垂直距离,你也必须垂直合身。对于这个问题,我想这有点太复杂了......
【解决方案2】:

一组二维值的平均值是另一个二维值,即它是一个点,而不是一条线。我相信这个点也被称为质心。

在这种情况下,标准差是什么并不完全清楚,但我认为根据与平均值的距离来定义它是有意义的。

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 2017-03-31
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多