python&深度学习 -- 训练的数据集中出现NaN值应该怎么办?Filling gaps in a numpy array

python&深度学习 – 训练的数据集中出现NaN值应该怎么办?

在深度学习的一些应用场景中,如海洋气象要素的预测、纠正等等。对于训练数据往往需要进行前处理,如处理缺测值、归一化等等。

特别是存在缺测值的情况,如果在深度学习中使用NaN值训练模型通常会导致以下问题:

  • 梯度无法计算:在深度学习中,我们使用反向传播算法计算梯度(模型参数相对于损失函数的导数),以便用梯度下降等优化算法来更新模型参数。但是,如果训练集中存在 NaN 值,则计算梯度时出现除以 0 的情况,从而导致梯度无法计算。

  • 模型无法收敛:如果训练集中存在 NaN 值,则可能会干扰损失函数的计算过程,从而影响模型参数的更新,使模型无法收敛。

  • 训练速度变慢:如果数据集中存在 NaN 值,则需要预处理数据,或者执行特殊步骤来跳过这些值。这些额外操作会增加训练时间,降低训练效率。

因此,在深度学习中,通常会在训练集中删除所有包含 NaN 值的样本,或者使用插值或其他技术来填充 NaN 值,以确保数据集不包含 NaN 值。这可以保证模型在训练过程中能够正确地计算梯度和收敛。

基于上述问题,这里介绍一个处理Nan值的简单方法,实现NaN值的填充。

这里将插值方法进行了封装,函数如下:

from scipy.ndimage import distance_transform_edt
def fill_nans(data_matrix):
    """Fills NaN's with nearest neighbours.

    This method is adapted from the method `fill`, which you can find here:
    https://stackoverflow.com/posts/9262129/revisions

    :param data_matrix: numpy array of real-valued data.
    :return: data_matrix: Same but without NaN's.
    """
    
    indices = distance_transform_edt(
        np.isnan(data_matrix), return_distances=False, return_indices=True
    )
    return data_matrix[tuple(indices)]

这个函数使用了 scipy.ndimage 库中的 distance_transform_edt 函数来计算每个 NaN 值到离它最近的非 NaN 值的距离,并将其替换为该非 NaN 值。具体来说,函数首先检查输入矩阵中的 NaN 值,然后使用 distance_transform_edt 函数计算每个 NaN 值到最近的非 NaN 值的欧几里得距离。最后,函数将每个 NaN 值替换为其相应的最近邻值。

需要注意的是,此函数不会保留原始数据矩阵,并且返回的结果是已经填充过 NaN 的新矩阵。

例如,假设有一个 data_matrix 矩阵:

import numpy as np

data_matrix = np.array([
    [1, 2, np.nan, np.nan],
    [4, np.nan, 6, 7],
    [8, np.nan, np.nan, 11],
    [np.nan, np.nan, 14, 15]
])

则可以通过以下方式调用 fill_nans 函数填充 NaN 值:

filled_matrix = fill_nans(data_matrix)

这样,就可以得到已经填充过 NaN 的新矩阵 filled_matrix。

filled_matrix
Out[66]: 
array([[ 1.,  2.,  2.,  7.],
       [ 4.,  4.,  6.,  7.],
       [ 8.,  8.,  6., 11.],
       [ 8., 14., 14., 15.]])

引用
https://stackoverflow.com/posts/9262129/revisions

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简朴-ocean

继续进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值