为特征向量数据(1D数组)叠加噪声实现数据增强

news2024/10/6 2:31:24

为特征向量数据(1D数组)叠加噪声实现数据增强

日期作者版本备注
2023.09.11Dog TaoV1.0完成文档的初始版本。

文章目录

  • 为特征向量数据(1D数组)叠加噪声实现数据增强
    • 背景介绍
    • 叠加噪声的主要方法
      • 高斯噪声(Gaussian Noise)
      • 均匀噪声(Uniform Noise)
      • 盐与胡椒噪声(Salt and Pepper Noise)
      • 随机遮挡噪声(Random Occlusion Noise)
      • 数据裁剪
    • 函数封装

背景介绍

数据增强(Data Augmentation)是一种在训练机器学习和深度学习模型时使用的技术,旨在通过对原始数据进行小的、随机的修改,来增加训练集的大小和多样性。这种增强的方法可以帮助模型学到更多的数据变化,从而增强模型的泛化能力,并减少过拟合。
在这里插入图片描述
根据数据的类型和特点,存在各种不同的数据增强技术。以下是针对不同类型数据的一些常见的数据增强方法:

  1. 图像数据:

    • 旋转、缩放、剪切
    • 色彩抖动(亮度、对比度、饱和度、色调变化)
    • 噪声注入(盐与胡椒噪声、高斯噪声)
    • 水平和垂直翻转
    • 仿射变换
    • 随机遮挡或模糊
  2. 时序数据/1D信号:

    • 噪声注入
    • 时间拉伸或压缩
    • 随机遮挡
    • 滑动窗口平均
    • 高频和低频滤波
  3. 文本数据:

    • 同义词替换
    • 随机删除、插入或交换单词
    • 句子重组
    • 回译(将文本翻译成另一种语言,然后再翻译回原语言)
  4. 音频数据:

    • 噪声注入(背景噪声、白噪声)
    • 变速不变调
    • 音高调整
    • 时间拉伸或压缩
    • 混响或其他音效添加
  5. 表格数据:

    • 抖动(对值进行轻微调整)
    • 特征交叉(组合两个或更多的特征)
    • 数据插补(使用统计方法或模型预测缺失值)
  6. 视频数据:

    • 与图像数据增强相似的技术,但在时间维度上应用
    • 帧间隔调整
    • 视频裁剪或切片

当考虑数据增强技术时,重要的是确保增强方法不会破坏数据的原始语义或特征。此外,应始终在一个验证集上评估模型,该验证集没有应用相同的增强方法,以确保模型的泛化能力。

叠加噪声的主要方法

一般情况下,在机器学习中一个特征数据的表示形式为一个高维向量(例如时序数据、传感器数据或任何非结构化的一维数据)。为一个高维向量增加噪声以实现数据增强,可以考虑以下几种方法:

高斯噪声(Gaussian Noise)

高斯噪声是最常用的噪声类型,它的值是根据正态分布(高斯分布)来生成的。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as np

def add_gaussian_noise_np(np_array, mean=0, std=1):
    """
    向numpy数组添加高斯噪声。
    
    参数:
        np_array (np.Array): 输入数组。
        mean (float): 高斯噪声的平均值。
        std (float): 高斯噪声的标准差。
        
    返回:
        np.Array: 添加了噪声的数组。
    """
    noise = np.random.normal(mean, std, np_array.shape)
    return np_array + noise

  • 基于torch.tensor类型
import torch

def add_gaussian_noise_torch(tensor, mean=0, std=1):
    """
    向torch.tensor添加高斯噪声。
    
    参数:
        tensor (torch.Tensor): 输入张量。
        mean (float): 高斯噪声的平均值。
        std (float): 高斯噪声的标准差。
        
    返回:
        torch.Tensor: 添加了噪声的张量。
    """
    noise = torch.normal(mean, std, size=tensor.shape)
    return tensor + noise


均匀噪声(Uniform Noise)

与高斯噪声不同,均匀噪声的值是从一个均匀分布中随机选取的。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as np

def add_uniform_noise_np(array, low=-1, high=1):
    """
    向numpy数组添加均匀噪声。
    
    参数:
        array (np.Array): 输入数组。
        low (float): 均匀噪声的最小值。
        high (float): 均匀噪声的最大值。
        
    返回:
        np.Array: 添加了噪声的数组。
    """
    noise = np.random.uniform(low, high, array.shape)
    return array + noise
  • 基于torch.tensor类型
import torch

def add_uniform_noise_torch(tensor, low=-1, high=1):
    """
    向torch.tensor添加均匀噪声。
    
    参数:
        tensor (torch.Tensor): 输入张量。
        low (float): 均匀噪声的最小值。
        high (float): 均匀噪声的最大值。
        
    返回:
        torch.Tensor: 添加了噪声的张量。
    """
    noise = torch.FloatTensor(tensor.size()).uniform_(low, high)
    return tensor + noise

盐与胡椒噪声(Salt and Pepper Noise)

这种噪声会将向量中的某些元素设置为最大值(例如1)或最小值(例如0),模拟真实世界中的“损坏”数据。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as np

def add_salt_pepper_noise_np(array, salt_prob=0.05, pepper_prob=0.05):
    """
    向numpy数组添加盐和胡椒噪声。
    
    参数:
        array (np.Array): 输入数组。
        salt_prob (float): 盐噪声的概率。
        pepper_prob (float): 胡椒噪声的概率。
        
    返回:
        np.Array: 添加了噪声的数组。
    """
    noise = np.random.choice([0, 1, 2], size=array.shape, p=[pepper_prob, salt_prob, 1 - salt_prob - pepper_prob])
    array[noise == 0] = 0
    array[noise == 1] = 1
    return array
  • 基于torch.tensor类型
import torch

def add_salt_pepper_noise_torch(tensor, salt_prob=0.05, pepper_prob=0.05):
    """
    向torch.tensor添加盐和胡椒噪声。
    
    参数:
        tensor (torch.Tensor): 输入张量。
        salt_prob (float): 盐噪声的概率。
        pepper_prob (float): 胡椒噪声的概率。
        
    返回:
        torch.Tensor: 添加了噪声的张量。
    """
    noise = torch.multinomial(torch.tensor([pepper_prob, salt_prob, 1 - salt_prob - pepper_prob]), num_samples=tensor.numel(), replacement=True)
    tensor[noise == 0] = 0
    tensor[noise == 1] = 1
    return tensor

随机遮挡噪声(Random Occlusion Noise)

随机遮挡噪声模拟真实情况中可能出现的部分损坏或遮挡的数据,以提高模型的泛化能力。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as np

def add_random_block_noise_np(array, block_size=5):
    """
    向numpy数组添加随机遮挡噪声。
    
    参数:
        array (np.Array): 输入数组。
        block_size (int): 遮挡区域的长度。
        
    返回:
        np.Array: 添加了噪声的数组。
    """
    
    # 确定开始点,确保有足够的空间添加遮挡
    start_idx = np.random.randint(0, array.shape[0] - block_size)
    
    # 将遮挡区域设置为0
    array[start_idx:start_idx+block_size] = 0
    
    return array
  • 基于torch.tensor类型
import torch

def add_random_block_noise_torch(tensor, block_size=5):
    """
    向torch.tensor添加随机遮挡噪声。
    
    参数:
        tensor (torch.Tensor): 输入张量。
        block_size (int): 遮挡区域的长度。
        
    返回:
        torch.Tensor: 添加了噪声的张量。
    """
    
    # 确定开始点,确保有足够的空间添加遮挡
    start_idx = torch.randint(0, tensor.size(0) - block_size, (1,)).item()
    
    # 将遮挡区域设置为0
    tensor[start_idx:start_idx+block_size] = 0
    
    return tensor

在这些函数中,我们选择了一个随机的开始点,并从该点开始将一维数组或张量中的连续数据设置为0,直到达到指定的block_size。

数据裁剪

当我们向向量添加噪声后,可能需要考虑是否需要对结果进行裁剪或归一化,以确保它们仍然在一个合理的范围内。例如,如果向量值的范围是[0, 1],那么在添加噪声后,可能需要执行以下操作来确保噪声后的向量仍然在这个范围内:

noisy_vector = np.clip(noisy_vector, 0, 1)

函数封装

我们设计一个函数来为特征数据叠加噪声,实现数据增强。将设计的函数命名为data_augmentation,该函数会接受以下参数:

  • xy:分别对应样本数据和标签数据。
  • augment_factor:增强数量,例如你想为每一组样本和标签生成10组样本和标签,那么这个值应设为10。
  • sigma:高斯噪声的标准偏差。
  • noise_range:均匀噪声的范围。
  • prob:盐与胡椒噪声的概率。

函数会为每一组输入样本生成augment_factor个增强样本,并返回增强后的样本和标签集。例如令augment_factor=10,对于每个输入样本和标签,我们将获得30倍(3种噪声类型 ✖ augment_factor)的增强样本和标签。我们可以根据需要调整增强的数量和程度。

import torch

def add_gaussian_noise(tensor, sigma):
    """
    为给定的tensor添加高斯噪声。
    
    参数:
    tensor: torch.Tensor - 输入的张量。
    sigma: float - 高斯噪声的标准偏差。
    
    返回:
    torch.Tensor - 添加了高斯噪声的张量。
    """
    noise = torch.normal(mean=0., std=sigma, size=tensor.size())
    return tensor + noise

def add_uniform_noise(tensor, noise_range):
    """
    为给定的tensor添加均匀噪声。
    
    参数:
    tensor: torch.Tensor - 输入的张量。
    noise_range: float - 均匀噪声的范围,噪声值将从[-noise_range, noise_range]选择。
    
    返回:
    torch.Tensor - 添加了均匀噪声的张量。
    """
    noise = torch.FloatTensor(tensor.size()).uniform_(-noise_range, noise_range)
    return tensor + noise

def add_salt_and_pepper_noise(tensor, prob):
    """
    为给定的tensor添加盐与胡椒噪声。
    
    参数:
    tensor: torch.Tensor - 输入的张量。
    prob: float - 添加盐或胡椒的概率。
    
    返回:
    torch.Tensor - 添加了盐与胡椒噪声的张量。
    """
    noise = torch.FloatTensor(tensor.size()).uniform_(0, 1)
    salt_and_pepper = torch.where(noise < prob/2, torch.ones_like(tensor), torch.where(noise < prob, torch.zeros_like(tensor)-1, torch.zeros_like(tensor)))
    return tensor + salt_and_pepper

def data_augmentation(x, y, augment_factor=10, sigma=0.1, noise_range=0.05, prob=0.01):
    """
    对给定的样本和标签进行数据增强。
    
    参数:
    x: torch.Tensor - 输入样本张量。
    y: torch.Tensor - 标签张量。
    augment_factor: int - 每种噪声类型的增强数量。
    sigma: float - 高斯噪声的标准偏差。
    noise_range: float - 均匀噪声的范围。
    prob: float - 盐与胡椒噪声的概率。
    
    返回:
    torch.Tensor, torch.Tensor - 增强后的样本和标签张量。
    """
    augmented_x, augmented_y = [], []

    # 为每个输入样本添加高斯噪声
    for _ in range(augment_factor):
        augmented_x.append(add_gaussian_noise(x, sigma))
        augmented_y.append(y)  # 噪声仅影响输入数据,不影响标签

    # 为每个输入样本添加均匀噪声
    for _ in range(augment_factor):
        augmented_x.append(add_uniform_noise(x, noise_range))
        augmented_y.append(y)

    # 为每个输入样本添加盐与胡椒噪声
    for _ in range(augment_factor):
        augmented_x.append(add_salt_and_pepper_noise(x, prob))
        augmented_y.append(y)

    # 返回堆叠后的增强样本和标签
    return torch.stack(augmented_x), torch.stack(augmented_y)


if __name__ == "__main__":
	# 使用示例
	x = torch.rand((1024,))
	y = torch.tensor([1])  # 假设这是一个标签
	augmented_x, augmented_y = data_augmentation(x, y, augment_factor=10, sigma=0.1, noise_range=0.05, prob=0.01)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动机器人(浙大)(待补充)

目录 1.简介 1.1分类 1.2执行模式 2.运动学建模 2.1简述 2.2建模 2.2.1分量叠加 3.导航规划 ​编辑 4.路径规划 1.简介 1.1分类 按移动方式&#xff1a;轮式、履带式、足式、躯干式 1.2执行模式 未知的环境中构建局部地图/已知环境则有地图&#xff0c;根据环境和定位信息进…

AtCoder Beginner Contest 319(D-G)

D.Tasks - AtCoder Beginner Contest 319 &#xff08;1&#xff09;题意 给你一个M行得框框和N个单词&#xff0c;每个单词有一个宽度&#xff0c;每个单词之间应该用一个空格隔开&#xff0c;首位单词不需要&#xff0c;问至少需要多宽才能使得单词不会超过M行。 &#xff08…

Batch normalization和Layer normalization

深度学习的归一化方法 1 归一化的目的 当我们使用梯度下降法做优化时&#xff0c;随着网络深度的增加&#xff0c;输入数据的特征分布会不断发生变化&#xff0c;为了保证数据特征分布的稳定性&#xff0c;会加入Normalization。从而可以使用更大的学习率&#xff0c;从而加速…

快速搭建:对象存储平台MinIO

简介&#xff1a;MinIO 是一个高性能的对象存储服务器&#xff0c;兼容Amazon S3云存储服务。适用于大数据存储和用于构建私有云的场景。作为一个对象存储服务&#xff0c;它基于Apache License 开源协议&#xff0c;兼容Amazon S3云存储接口。适合存储非结构化数据&#xff0c…

【软件分析/静态分析】chapter8 课程11/12 指针分析—上下文敏感(Pointer Analysis - Context Sensitivity)

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a; 南京大学《软件分析》课程11&#xff08;Pointer Analysis - Context Sensitivity I&#xff09;_哔哩哔哩_bilibili 南京大学《软件分析》课程12&#xff08;Pointer Analysis - Context Sensitivity II&…

PCL入门(四):octree简单使用

目录 1. 八叉树(Octree)2. 简单使用 参考博客《三维点云数据的两种结构Kdtree和Octree》和《八叉树》 1. 八叉树(Octree) 只需要考虑三维情况下的八叉树的情况&#xff0c;如下 设置最大的递归深度&#xff1b;找出场景的最大尺寸&#xff0c;并据此创建第一个立方体若未到达…

linux安装jdk1.8

1.下载jdk安装包&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8-windows 2.创建java文件夹&#xff1a; mkdir /usr/local/java3.上传安装包并解压&#xff1a; tar -xzf jdk-xxx.tar.gz4.修改profile文件&#xff1a; vim /etc/profile在文…

计算机专业毕业设计项目推荐04-物业管理系统(SpringBoot+原生Js+Mysql)

物业管理系统&#xff08;SpringBoot原生JsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计…

物联网 低功耗蓝牙BLE GATT 实现微信小程序通信连接详细教程

蓝牙基本概念 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz ~ 2.485GHz左右&#xff09;&#xff0c;进行电磁波传输。蓝牙传输原理是主从关系&#xff0c;一个主设备可以与7个蓝牙从设备配对。 经典蓝牙 vs BLE 蓝牙分为经典蓝牙和低功耗…

最新软件测试面试题+笔试题(十个面试官里有九个会问)

2023最新软件测试面试大全看完offer拿到手软_哔哩哔哩_bilibili2023最新软件测试面试大全看完offer拿到手软共计21条视频&#xff0c;包括&#xff1a;1.HR已读不回问题分析以及如何解决、2.HR已读不回之针对性进行简历优化。、3.HR已读不回之针对性进行技能提升路线。等&#…

编程语言流行度排名(每月更新)

2023年09月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自谷歌Trends 如果您相信集体智慧&#xff0c;那么流行编程语言排名可以…

数据结构与算法之二叉树、二叉搜索树、平衡二叉树、红黑树、B - 树、哈夫曼树等详细教程(更新中)

第一章、二叉树概述和基本算法 1.1 二叉树遍历算法概述 对于二叉树&#xff0c;其实遍历顺序一共有6种&#xff0c;基于有左子树&#xff0c;右子树&#xff0c;根这三个因素&#xff0c;即排列组合有3 * 2 * 16种结合顺序&#xff0c;不过因为算法思想是一样的&#xff0c;就…

day 4

#!/bin/bashfunction adda() { #a($*)sum0 for i in $*do ((sumi))donereturn $sum }arr(5 4 3 2 1 50) adda ${arr[*]} add$? echo $addfunction A() { echo id -uecho id -g }BA echo "uid和gid分别是:"$Bxmind

基于springboot2+mybatis-plus+jsp增删改查

概述 编写简单增删改查&#xff0c;理解之后可以自己试着扩展&#xff0c;相信你也可以&#xff0c;加油&#xff0c;我自己懂了的用注释记在下面方便理解 详细 一、需求&#xff08;要做什么&#xff09; 基于现今最流行的技术实现增删改查demo&#xff0c; 便于初学者上手…

JAVAEE初阶相关内容第八弹--多线程(初阶)

本文目录 阻塞队列 阻塞队列是什么&#xff1f; 标准库中的阻塞队列 生产者消费者模型 阻塞队列的实现 普通队列实现&#xff1a; 入队列&#xff1a; 出队列&#xff1a; 完整代码&#xff1a; 加阻塞 加锁 加阻塞 阻塞队列 队列&#xff1a;先进先出&#xff0c;…

福立转债,科数转债上市价格预测

福立转债118043 基本信息 转债名称&#xff1a;福立转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;7.0亿元。 正股名称&#xff1a;福立旺&#xff0c;今日收盘价&#xff1a;20.07元&#xff0c;转股价格&#xff1a;21.28元。 当前转股价值 转债面值…

Java—JDK8新特性—重复注解

目录 重复注解是什么&#xff1f; 常见的重复注解的应用场景 源码&#xff08;JDK中哪里&#xff1f;&#xff09; 在实际开发中哪里使用了注解&#xff08;举例&#xff09; 使用步骤 案例 重复注解是什么&#xff1f; 重复注解&#xff0c;一个注解可以在一个类、方法、…

限流式保护器在古建筑消防安全中的应用

安科瑞 华楠 【摘要】我国古建筑众多且具有自身的消防安全特性。本文结合当前古建筑消防安全形势从消防管理、防火设计及火灾扑救三个方面对我国古建筑消防安全问题进行系统的阐述并提出相关对策。 【关键词】古建筑&#xff1b;消防安全&#xff1b;电气防火&#xff1b;限流…

C++ String类的简单实现(非模板)

头文件 #ifndef MY_STRING_H #define MY_STRING_Hclass Mstring {private:int m_length;char* m_pointer;public://构造函数Mstring();//有参构造Mstring(const char* str);//拷贝构造Mstring(const Mstring& obj);//获取长度int length()const;//转换为C字符串const char…

sprinboot 引入 Elasticsearch 依赖包

1.springboot与es的版本有比较强的绑定关系&#xff0c;如果springboot工程引入es的依赖后报一些依赖的错误&#xff0c;那么就看表格中的对应关系&#xff0c;将sprinboot或者es的版本做对应的调整 2.本人是从springboot1.x升级到springboot2.x&#xff0c;做了排包工作 3.升级…