matlab 如何用插值给NAN赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 如何用插值给NAN赋值相关的知识,希望对你有一定的参考价值。

矩阵中有许多NAN值,如何通过interp1函数将nan换成有意义的值。

参考技术A 第一列到倒数第二列都是nan,之后最后一列有值
那么其他值以什么标准来填新值呢?
哪怕多知道第一列的值,中间的还可以根据一前一后两个值插值计算得出

如果有足够的数据,至少第一点和最后一点知道,还是可以通过interp1插值填充的
只是要处理一下避开nan点

假设你原来数据是a
使用find(isnan(a))可以返回所有数据中是nan的值的位置
可以根据其填充新值
参考技术B 这个应该做不了,插值本来就对原始数据要求挺高的,你要是原始数据有问题,插值的结果更有问题了 参考技术C interp1做不了,因为它要求已知数据必须是在规则网格上采样的。而含有nan的矩阵就不是规则网格了。追问

那不插值了 ,直接引用最新的值替代nan值怎么做。 比如第一列到倒数第二列都是nan最后一列有实值。 最好是用for 进行程序化赋值所有nan值。

追答

最新的值 从哪来?

MATLAB:使用插值替换缺失值 (NaN)

【中文标题】MATLAB:使用插值替换缺失值 (NaN)【英文标题】:MATLAB: Using interpolation to replace missing values (NaN) 【发布时间】:2011-04-07 10:28:09 【问题描述】:

我有一个元胞数组,每个元胞数组都包含一系列值作为行向量。序列包含一些由NaN 表示的缺失值。

我想使用某种插值方法替换所有 NaN,我如何在 MATLAB 中做到这一点?我也愿意接受有关如何处理这些缺失值的其他建议。

考虑这个示例数据来说明问题:

seq = randn(1,10); randn(1,7); randn(1,8);
for i=1:numel(seq)
    %# simulate some missing values
    ind = rand( size(seqi) ) < 0.2;
    seqi(ind) = nan;
end

结果序列:

seq1
ans =
     -0.50782     -0.32058          NaN      -3.0292     -0.45701       1.2424          NaN      0.93373          NaN    -0.029006
seq2
ans =
      0.18245      -1.5651    -0.084539       1.6039     0.098348     0.041374     -0.73417
seq3
ans =
          NaN          NaN      0.42639     -0.37281     -0.23645       2.0237      -2.2584       2.2294

编辑:

根据回复,我认为存在混淆:显然我不是在处理随机数据,上面显示的代码只是数据结构的一个示例。

实际数据是某种形式的处理信号。问题是在分析过程中,如果序列包含缺失值,我的解决方案将失败,因此需要过滤/插值(我已经考虑使用每个序列的平均值来填补空白,但我希望有更强大的东西)

【问题讨论】:

在您的示例中,我认为您很难找到一种插入缺失值的方法。插值要求数据点之间存在某种关系。通常这可能是它们来自时间序列(所以一个很好的猜测是可以从附近的点推断出缺失的部分)。在您的示例数据中,您试图猜测仅基于其他硬币翻转的“硬币翻转”。如果您可以向我们提供有关您的具体示例的更多信息,我们可以提供更多帮助。 @JudoWill:我认为他只是用随机数据作为人们玩的例子。 【参考方案1】:

好吧,如果您正在处理时间序列数据,那么您可以使用 Matlab 的内置插值函数。

这样的事情应该适合你的情况,但你需要稍微调整一下......即。如果您没有等间距采样,则需要修改 times 行。

nseq = cell(size(seq))
for i = 1:numel(seq)
    times = 1:length(seqi);
    mask =  ~isnan(seqi);
    nseqi = seqi;
    nseqi(~mask) = interp1(times(mask), seqi(mask), times(~mask));

end

您需要使用interp1 的选项来确定哪些选项最适合您的情况。

【讨论】:

谢谢,在我的情况下,我需要更改 times 向量,因为值是以 3 秒为基础记录的 ...现在我在想它,只要序列被同等采样,不是吗? 是的,只要它们的采样相同,这并不重要......但我尽量做到明确。【参考方案2】:

我会使用inpaint_nans,这是一种旨在通过插值替换一维或二维矩阵中的 nan 元素的工具。

seq1 = [-0.50782 -0.32058 NaN -3.0292 -0.45701 1.2424 NaN 0.93373 NaN -0.029006];
seq2 = [0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417];
seq3 = [NaN NaN 0.42639 -0.37281 -0.23645 2.0237];

for i = 1:3
  seqi = inpaint_nans(seqi);
end

seq:
ans =
 -0.50782 -0.32058 -2.0724 -3.0292 -0.45701 1.2424 1.4528 0.93373 0.44482 -0.029006

ans =
  0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417

ans =
  2.0248 1.2256 0.42639 -0.37281 -0.23645 2.0237

【讨论】:

【参考方案3】:

如果您有权访问系统识别工具箱,则可以使用MISDATA 函数来估计缺失值。根据documentation:

此命令线性插值 缺失值来估计第一个 模型。然后,它使用这个模型 将缺失数据估计为 通过最小化输出参数 得到的预测误差 重建数据。

基本上,该算法在估计缺失数据和估计模型之间交替进行,其方式类似于期望最大化 (EM) 算法。

估计的模型可以是任何线性模型idmodel (AR/ARX/..),或者如果未给出,则使用默认顺序状态空间模型。

以下是如何将其应用于您的数据:

for i=1:numel(seq)
    dat = misdata( iddata(seqi(:)) );
    seqi = dat.OutputData;
end

【讨论】:

【参考方案4】:

使用griddedInterpolant

还有一些其他功能,例如 interp1。对于曲线图,样条曲线是查找缺失数据的最佳方法。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @Michel 这不是仅链接的答案。答案是要使用的函数的名称 - 该链接只是指向该函数文档的链接。 @jwg 您的问题处于低质量审查中。您可能想分享如何使用该功能,而不仅仅是功能名称和链接。【参考方案5】:

正如 JudoWill 所说,您需要假设数据之间存在某种关系。

一个简单的选择是计算整个系列的平均值,并将其用于缺失数据。另一个简单的选择是取 n 个前一个值和 n 个下一个值的平均值。

但要非常小心:如果您丢失了数据,通常最好处理这些丢失的数据,而不是编造一些可能会破坏您的分析的虚假数据。

【讨论】:

【参考方案6】:

考虑以下示例

X=一些 Nx1 数组 Y=F(X),其中包含一些 NaN

然后使用

X1=X(find(~isnan(Y))); Y1=Y(find(~isnan(Y)));

现在对 X1 和 Y1 进行插值以计算所有 X 处的所有值。

【讨论】:

以上是关于matlab 如何用插值给NAN赋值的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB:使用插值替换缺失值 (NaN)

如何用MATLAB 编写interpl插值函数

MATLAB:在时间序列中对 NaN 进行插值

运行MATLAB算法程序时报错SVD 的输入不能包含 NaN 或 Inf,求大神指导

如何用matlab绘制三维地形图

如何用matlab给地图标点?