【问题标题】:Explain MATLAB function smooth(x,y,span,'moving')解释 MATLAB 函数 smooth(x,y,span,'moving')
【发布时间】:2015-11-16 06:06:11
【问题描述】:

我最近偶然发现Matlab的平滑函数使用如下:

ans = smooth(x, y, span, 'moving');

Matlab 文档说明

yy = smooth(x,y,...) 额外指定 x 数据。如果未提供 x,则需要 x 数据的方法假定 x = 1:length(y)。当 x 数据不是均匀间隔或排序时,您应该指定它。如果 x 不均匀且您未指定方法,则使用 lowess。如果平滑方法需要对 x 进行排序,则排序会自动进行。

但是,我不清楚这对于“移动”平均情况究竟意味着什么。 x 是 y 数据的索引吗?如果是,x 的非整数值如何影响 y 的“移动”平均值?

【问题讨论】:

    标签: matlab smoothing


    【解决方案1】:

    移动平均意味着yy(或在您的情况下为ans)的每个值是n个最近点的平均值。 https://en.wikipedia.org/wiki/Moving_average 有几种计算方法 - 这取决于我们将使用哪些点。例如:

    ( (i-1) + (i-2) + ... + (i-n) )/n;
    

    其中 n - 是span线性过滤级别。 这意味着无法计算前三个点(没有数据)。有时结果必须改变(因为真的 - 前 4 个点的平均值并不真正对应于第 4 个元素)。

    所以Matlab使用了另一种方法:

    yy(1) = y(1)
    yy(2) = (y(1) + y(2) + y(3))/3
    yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5
    yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5
    ...
    

    它更有用。

    关于xy - 通常是二维数据:每个x 对应于每个y。您可以避免设置x,然后matlab 将为此使用[1, 2, 3, ..., length(y)] 序列。但是,如果您有一些非均匀分布的数据,则必须对其进行设置以获得正确的结果。因此,如果您有非整数值,它将正常工作,将其缩放为 x 轴。这是我头脑中最简单的例子:

    【讨论】:

    • 为了确保我理解你:具有移动平均线的非整数 x'es 仅用于排序,得到的平滑 y 是否与将订单投影到整数索引上相同?
    • 对不起,我不明白什么是“非整数 progrcted into an integer index”,但看看我的情节 - 结果平滑函数(红色)的点具有相同的非整数 x 值作为使用的数据(蓝色)。这意味着smooth 考虑了 x 轴点之间的不同长度,但结果点不会有整数 x 值,但与您路由到smooth 的 x 数据相同。
    【解决方案2】:

    假设您的数据 y 被噪声破坏,我们假设 y = [2.1, 3.2, 1.7, 4.5, 5.8, 6.9]。假设您决定使用 3 个窗口滤波器的移动平均来平滑 y

    smoothedY1 = (2.1 + 3.2 + 1.7)/3 = 2.3333
    smoothedY2 = (3.2 + 1.7 + 4.5)/3 = 3.1333
    smoothedY3 = (1.7 + 4.5 + 5.8)/3 = 4.0000
    smoothedY3 = (4.5 + 5.8 + 6.9)/3 = 5.7333
    

    注意每次迭代中损坏的数据向左移动一个元素的方式。现在让我们在 Matlab 中使用smooth()

    y = [2.1, 3.2, 1.7, 4.5, 5.8, 6.9];
    smooth(y, 3, 'moving')
    

    上面的脚本产生以下结果

    ans =
        2.1000
        2.3333 <----
        3.1333      |  (smoothed data)
        4.0000      | 
        5.7333 <----
        6.9000
    

    【讨论】:

      【解决方案3】:

      为了回答您的原始问题,“x”数据仅用于排序,但在方法“移动”时会被忽略:

      >> x = rand(10, 1);
      >> y = (1:10)' + 0.1*randn(10,1);
      >> isequal(smooth(x,y,'moving'), smooth(y,'moving'))
      ans =
         0
      >> z = sortrows([x y], 1);
      >> isequal(smooth(z(:,1),z(:,2),'moving'), smooth(z(:,2),'moving'))
      ans =
         1
      

      “x”值实际上并未考虑平均,它们只是用于通过增加索引来对“y”进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-24
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多