Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

В этой статье вы узнаете, почему вы должны добавлять шум к синтетическим данным, какие бывают типы шумов и как их добавлять.

Что такое шум?

Шум — это в основном бессмысленная информация, добавляемая к данным, которая приводит к их повреждению или искажению.

Шум на изображении, затрудняющий распознавание содержимого изображения
Шум на изображении, затрудняющий распознавание содержимого изображения

Добавление шума к данным является результатом их неправильного сбора и хранения. Например, набор табличных данных может собирать шум из-за человеческих ошибок, таких как небрежное отношение к точности данных, усечение данных, неправильная маркировка данных, программные ошибки и мошенническое вмешательство в данные. Нечеловеческие причины шума обычно включают проблемы с датчиком камеры, проблемы с микрофоном и неправильную фильтрацию, вызывающую шум в изображениях и звуке. Неправильное хранение фотопленок может привести к появлению шумов на пленках. Тепловые колебания в материале могут вызвать шум в электрических сигналах, проходящих в этом материале. Шум в радиосигналах может быть вызван электромагнитными помехами в космосе.

Шум также может быть добавлен намеренно по причинам, которые вы узнаете в следующем разделе.

В большинстве случаев шумы распространяются случайным образом. Это связано с тем, что процессы, генерирующие шум, часто слишком сложны для контроля и поэтому носят непредсказуемый характер.

Случайность шума приводит к тому, что он обладает статистическими свойствами, такими как распределение, дисперсия и т. д., что позволяет нам использовать статистику для создания искусственного шума с некоторыми желаемыми свойствами.

Почему вы должны добавлять шум в свои синтетические данные?

Реальные данные часто содержат некоторое количество шума. В большинстве случаев практически невозможно собрать данные без шума. Следовательно, для алгоритмов машинного обучения становится важным выдерживать шум и изучать основные закономерности, присутствующие в данных. То есть модель должна быть способна хорошо обобщать зашумленные обучающие данные, чтобы она могла делать удовлетворительные прогнозы на заведомо зашумленных производственных данных. Но синтетические данные часто создаются для отражения идеальных данных, свободных от шума, а не для отражения реальных данных, которые в большинстве случаев содержат шум. Если ваша модель была обучена на синтетических (без шума) данных, она пытается соответствовать всем точкам обучающих данных и не будет обобщать, а когда она питается реальными (зашумленными) данными, она не сможет хорошо работать с ними,

Добавляя шум к своим синтетическим данным, вы даете своей модели возможность обобщать зашумленные данные и изучать основные закономерности в данных вместо того, чтобы подгонять каждую точку. Это может предотвратить чрезмерную подгонку и повысить производительность моделей во время производства.

Здесь следует отметить одну вещь: простого добавления шума недостаточно; ваша модель должна иметь правильный уровень сложности, чтобы помочь ей обобщить зашумленные данные. Если ваша модель слишком сложна, она просто будет пытаться соответствовать шуму и не сможет обобщить, что сделает добавление шума бесполезным.

Как добавить шум?

Лучший способ добавить шум к вашим данным — это случайным образом изменить значения точек данных. Это означает, что вы можете выбрать некоторые точки данных в случайных местах и изменить их значения случайным образом. Конечно, вы хотите контролировать количество точек данных для изменения и степень, в которой они должны быть изменены. Добавление шума к вашим данным и контроль над ним могут быть достигнуты с помощью нескольких методов добавления шума. Вот некоторые из наиболее часто используемых методов:

  • Гауссовский шум
  • Импульсный шум.
  • Шум квантования

В Python мы можем использовать статистические функции Numpy, чтобы добавлять эти шумы и управлять их свойствами, как описано ниже.

Гауссовский шум

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Гауссовский шум технически является гауссовским распределением, он называется шумом, когда добавляется к данным, вызывая их искажение. Это широко используемый шум по следующим причинам.

  • Он имеет хорошо понятные свойства и полностью определяется своим средним значением и стандартным отклонением, над ним можно добиться хорошего контроля и предсказуемости.
  • Большинство шумов, встречающихся в природе, напоминают гауссовский шум, что делает его идеальным выбором для моделирования.
  • Добавить гауссовский шум просто и понятно (что вы увидите в примерах кода ниже).

Самый простой способ добавить гауссовский шум — создать гауссово распределение размера, такое же, как у данных, затем добавить первое значение в распределении к первому значению в данных, далее добавить второе значение в распределении ко второму значению в данных и так далее.

Вы можете использовать python и numpy для создания гауссового шума.

gaussian_noise = numpy.random.normal(mean, std_deviation, shape)

Вы можете отрегулировать количество шума, отрегулировав среднее значение распределения, и интенсивность шума, отрегулировав стандартное отклонение. Убедитесь, что параметр формы такой же, как у исходных данных.

Ниже приведен пример кода Python с Numpy для создания линейных данных, гауссовского шума и добавления шума к этим данным.

# Data creation # Create independent variable x = np.arange(0,100,2) # Produces [0, 100) with steps of 2. # Use a linear function to obtain the dependent variable y = 0.3*x + 0.6 # Parameters are arbitrary. # Noise generation # Genearte noise with same size as that of the data. noise = np.random.normal(0,2, len(x)) # μ = 0, σ = 2, size = length of x or y. Choose μ and σ wisely. # Add the noise to the data. y_noised = y + noise # Since both y and noise are numpy arrays of same size, the addition is done element-wise.

График исходных данных, шума и тех же данных с добавленным шумом:

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Вы также можете добавить шум к данным более высокого измерения, например, к 2D-данным, таким как изображение. Затем шум изменит интенсивность пикселей на величину интенсивности шума. Опять же, убедитесь, что шум имеет тот же размер, что и изображение.

Пример кода:

# Read Image img = imread('eye.jpg') # Color image # Convert the image to grayscale img_gray = img[:,:,1] # Genearte noise with same shape as that of the image noise = np.random.normal(0, 50, img_gray.shape) # Add the noise to the image img_noised = img_gray + noise # Clip the pixel values to be between 0 and 255. img_noised = np.clip(img_noised, 0, 255).astype(np.uint8)

Сюжет:

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Вы также можете добавить шум аналогичным образом к цветному изображению, и в этом случае шум изменит не только интенсивность пикселей, но и их цвет.

Сюжет:

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Импульсный шум

Импульсный шум — это в основном внезапные скачки или падения значений данных, добавление такого шума может имитировать реальные данные, которые обычно имеют несколько всплесков в случайных местах. Это явление также называются выбросами. Вы можете добавить импульсный шум, просто увеличив или уменьшив значения данных в нескольких случайных местах данных.

Код:

# Create data x = np.arange(0,360,1) y = np.sin(np.deg2rad(x)) # Generating noise # Generate a noise sample consisting of values that are a little higer or lower than a few randomly selected values in the original data. noise_sample = np.random.default_rng().uniform(0.2*min(y), 0.3*max(y), int(0.03*len(y))) # Generate an array of zeros with a size that is the difference of the sizes of the original data an the noise sample. zeros = np.zeros(len(y) - len(noise_sample)) # Add the noise sample to the zeros array to obtain the final noise with the same shape as that of the original data. noise = np.concatenate([noise_sample, zeros]) # Shuffle the values in the noise to make sure the values are randomly placed. np.random.shuffle(noise) # Obtain data with the noise added. y_noised = y + noise

Сюжет:

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Salt and pepper (чередование чёрных и белых частиц)

Чередование чёрных и белых частиц — это тип импульсного шума, в котором случайные точки данных заменяются минимальными или максимальными значениями данных. Этот тип шума естественным образом возникает в данных изображения, вызванный неисправностями датчика и повреждением данных во время хранения и передачи данных, и, таким образом, этот шум может имитировать отсутствующую или поврежденную информацию.

Пример кода:

# Get the image size (number of pixels in the image). img_size = img_gray.size # Set the percentage of pixels that should contain noise noise_percentage = 0.1 # Setting to 10% # Determine the size of the noise based on the noise precentage noise_size = int(noise_percentage*img_size) # Randomly select indices for adding noise. random_indices = np.random.choice(img_size, noise_size) # Create a copy of the original image that serves as a template for the noised image. img_noised = img_gray.copy() # Create a noise list with random placements of min and max values of the image pixels. noise = np.random.choice([img_gray.min(), img_gray.max()], noise_size) # Replace the values of the templated noised image at random indices with the noise, to obtain the final noised image. img_noised.flat[random_indices] = noise

Сюжет:

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Шум квантования

Это тип шума, при котором некоторые случайные значения непрерывной переменной представлены дискретными значениями, что приводит к снижению точности этих значений.

Например, рассмотрим следующий набор данных, содержащий непрерывные значения:

[1.22, 4.35, 6.30, 8.01, 10.44…]

Когда к этим данным добавляется шум квантования, некоторые из его значений становятся дискретными, как показано ниже. (Дискретизированные значения выделены жирным шрифтом):

[1.22, 4 , 6.30, 8.01, 10 …]

Эти дискретизированные значения представляют собой шум.

Один из самых простых способов добавить этот шум к вашим данным — просто округлить некоторые случайные значения в данных, и все готово.

Код:

# Creating data # Create independent variable x = np.arange(0,100,2) # Create a dependent variable with continuous values y = 0.3*x + 0.6 #This is a Linear function # Generating noise # Get the size of the independent variable y_size = len(y) # Set the percentage of data that should contain noise noise_percentage = 0.2 # Setting to 20% # Determine the size of the noise based on the noise precentage noise_size = int(noise_percentage * y_size) # Randomly select indices for adding noise. random_indices = np.random.choice(y_size, noise_size) # Create a copy of the original data that serves as a template for the noised data. y_noised = y.copy() # Round-off values of the templated noised data at random indices, to obtain the final noised data. y_noised[random_indices] = np.rint(y_noised[random_indices])

Сюжет:

Руководство по добавлению шума в синтетические данные с использованием Python и Numpy

Теперь добавьте немного шума к вашим идеальным синтетическим данным и посмотрите, как ваша модель работает с ними.

Вы можете найти код для приведенных выше графиков в моем репозитории GitHub здесь .

Спасибо за прочтение!

Начать дискуссию