【问题标题】:how to deal with nans when using an exponential smoothing function使用指数平滑函数时如何处理 nans
【发布时间】:2015-10-19 09:26:53
【问题描述】:

matlab中使用指数函数时nan的问题应该如何处理?

例如,我可以使用指数平滑函数:

v = datenum(2008, 1, 1):datenum(2010, 11, 31); % time vector
d = rand(1,length(v)); % data vector

fd = d;
alpha_o = 0.2;
for ii = 2:length(fd);
    fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1);
end

plot(v,d); hold on; plot(v,fd);

但是,如果我在时间序列中有一个 nan(或者结果是许多 nan):

d(10) = nan;

然后,平滑的输出将是 nan,遵循时间序列中 nan 的位置。

应该如何处理?我应该删除所有的 nans 然后运行该函数吗?

我认为对我的数据使用指数平滑函数的意义在于它提供了原始系列的平滑和滞后版本。但是,如果您删除了 nans,这不会导致结果错误吗?

我看过这篇帖子Using exponential smoothing with NaN values,但它并没有真正提供任何我可以在这里应用的有用提示。

我也想过避开 nan 部分,说如果是 nan,使用最后一个已知的平滑值:

fd = d;
alpha_o = 0.2;
for ii = 2:length(fd);
    if isnan(fd(ii)) == 1;
       fd(ii) = fd(ii-1); 
    else
        fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1);
    end
end
plot(v,d); hold on; plot(v,fd);

这是最好的解决方案吗?不知道如果第一个值是一个 nan 想法我会怎么做......

【问题讨论】:

  • 对待nans的方式是你的选择。你可以删除它们,你可以用插值填充它们,或者你可以让你的算法输出 NaN 作为 NaN 输入。这取决于您的 NaN 是什么以及如何创建。
  • 如果您正在进行平滑和插值,通常的做法是删除您的 NaN,因为它们会在一定程度上影响您的结果。
  • 我不确定这是否适合 StackOverflow。这是非常基于意见的,取决于您的具体情况以及您希望实现的目标,这在您的问题中并不清楚。
  • 我不会简单地删除 NaN 值。你最终会得到numel(fd) ~= numel(v)

标签: matlab


【解决方案1】:

如果你的数据中有nans,你在做这样的处理时绝对应该忽略它们(这些点应该是0吗?-inf?inf?10.5?pi?)。要点是,正如@IKavanagh 指出的那样,您实际上必须完全忽略这些点,即删除与nans 相对应的v 元素:

v = datenum(2008, 1, 1):datenum(2010, 11, 31); % time vector
d = rand(1,length(v)); % data vector

d(10) = nan;

v = v(~isnan(d));
d = d(~isnan(d));

%do the rest of the processing as usual

fd = d;
alpha_o = 0.2;
for ii = 2:length(fd);
    fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1);
end

plot(v,d); hold on; plot(v,fd);

nans 存在于您的数据中这一事实表明您这些数据点是无效的,因此您必须摆脱它们以进行平滑/拟合(plot 将自动忽略这些)。

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 2015-07-21
    • 2013-05-21
    • 1970-01-01
    • 2019-08-18
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多