Необходимость генерации случайных чисел в NumPy
NumPy, являясь основой для многих научных вычислений в Python, предоставляет мощные инструменты для генерации псевдослучайных чисел (PRNG). Эти числа, хотя и генерируются детерминированным алгоритмом, имитируют случайность и широко используются в моделировании, статистике, машинном обучении и других областях. Например, в контекстной рекламе случайные числа могут использоваться для A/B тестирования различных вариантов объявлений или для выбора случайной выборки пользователей для показа определенной рекламы. Без надежного генератора случайных чисел невозможно корректно проводить симуляции и эксперименты.
Обзор модуля numpy.random и его эволюция
Модуль numpy.random содержит различные функции для генерации случайных чисел из разных распределений. Исторически, он развивался, и более старые методы могут иметь недостатки в статистических свойствах или производительности. Современный подход заключается в использовании numpy.random.default_rng() для создания генератора, который обеспечивает более надежную и гибкую генерацию случайных чисел. Ранее использовались глобальные состояния генератора, что затрудняло воспроизводимость и параллелизацию.
Основные методы генерации псевдослучайных чисел в NumPy
numpy.random.rand(): Генерация случайных чисел с равномерным распределением
Функция numpy.random.rand() генерирует случайные числа с равномерным распределением в интервале [0, 1). Она принимает в качестве аргументов размеры массива, который нужно сгенерировать.
import numpy as np
def generate_uniform_random_numbers(shape: tuple) -> np.ndarray:
"""Generates an array of uniform random numbers.
Args:
shape: The desired shape of the array.
Returns:
A NumPy array containing uniform random numbers.
"""
return np.random.rand(*shape)
random_array = generate_uniform_random_numbers((2, 3))
print(random_array)
numpy.random.randn(): Генерация случайных чисел со стандартным нормальным распределением
numpy.random.randn() генерирует случайные числа из стандартного нормального распределения (среднее 0, стандартное отклонение 1). Как и rand(), принимает размеры массива в качестве аргументов.
import numpy as np
def generate_normal_random_numbers(shape: tuple) -> np.ndarray:
"""Generates an array of normally distributed random numbers.
Args:
shape: The desired shape of the array.
Returns:
A NumPy array containing normally distributed random numbers.
"""
return np.random.randn(*shape)
normal_array = generate_normal_random_numbers((2, 3))
print(normal_array)
numpy.random.randint(): Генерация случайных целых чисел в заданном диапазоне
numpy.random.randint(low, high, size) генерирует случайные целые числа в диапазоне [low, high). Аргумент size определяет размер массива.
import numpy as np
def generate_random_integers(low: int, high: int, size: tuple) -> np.ndarray:
"""Generates an array of random integers within a specified range.
Args:
low: The lower bound of the range.
high: The upper bound of the range (exclusive).
size: The desired shape of the array.
Returns:
A NumPy array containing random integers.
"""
return np.random.randint(low, high, size=size)
integer_array = generate_random_integers(1, 10, (2, 3))
print(integer_array)
numpy.random.random(): Генерация случайных чисел с плавающей точкой в полуоткрытом интервале [0.0, 1.0)
Функция numpy.random.random(size) генерирует случайные числа с плавающей точкой в полуоткрытом интервале [0.0, 1.0). Аргумент size определяет размер массива.
import numpy as np
def generate_float_random_numbers(size: tuple) -> np.ndarray:
"""Generates an array of float random numbers.
Args:
size: The desired shape of the array.
Returns:
A NumPy array containing float random numbers.
"""
return np.random.random(size=size)
float_array = generate_float_random_numbers((2, 3))
print(float_array)
Улучшенный генератор псевдослучайных чисел PCG64 в NumPy
Введение в numpy.random.default_rng()
numpy.random.default_rng() создает экземпляр генератора псевдослучайных чисел PCG64. Это рекомендуемый способ генерации случайных чисел в NumPy, поскольку он обеспечивает более надежную и гибкую генерацию случайных чисел по сравнению со старыми методами.
Преимущества использования default_rng() перед устаревшими методами
- Лучшие статистические свойства: PCG64 имеет лучшие статистические свойства по сравнению с устаревшими генераторами, что делает его более подходящим для сложных симуляций и научных вычислений.
- Улучшенная воспроизводимость:
default_rng()позволяет легко воспроизводить результаты, создавая отдельные экземпляры генератора с определенным начальным значением (seed). - Более эффективное управление состоянием: Вместо использования глобального состояния,
default_rng()инкапсулирует состояние генератора в объекте, что облегчает параллелизацию и избежание конфликтов.
Настройка и управление генератором default_rng()
Можно инициализировать default_rng() с начальным значением (seed), чтобы обеспечить воспроизводимость.
import numpy as np
def create_rng_with_seed(seed: int) -> np.random.Generator:
"""Creates a random number generator with a specific seed.
Args:
seed: The seed value for the generator.
Returns:
A NumPy Generator object.
"""
return np.random.default_rng(seed)
rng = create_rng_with_seed(42)
random_numbers = rng.random((2, 3))
print(random_numbers)
Сравнение методов и выбор оптимального
Критерии выбора метода: скорость, статистические свойства, повторяемость
При выборе метода генерации случайных чисел необходимо учитывать несколько факторов:
- Скорость: Для некоторых приложений скорость генерации имеет решающее значение.
- Статистические свойства: Важно, чтобы генератор обеспечивал хорошие статистические свойства, особенно для сложных симуляций.
- Повторяемость: Возможность воспроизведения результатов важна для отладки и проверки.
Рекомендации по использованию устаревших методов и default_rng()
- Устаревшие методы (
rand(),randn(),randint(),random()) все еще могут быть полезны для простых задач, где скорость важна, а статистические свойства не критичны. Однако, для новых проектов рекомендуется использоватьdefault_rng(). - Для задач, требующих высокой надежности и воспроизводимости, следует использовать
default_rng()с заданным начальным значением.
Примеры использования различных методов в задачах машинного обучения и научных вычислений
В машинном обучении, default_rng() можно использовать для инициализации весов нейронных сетей, разделения данных на обучающие и тестовые наборы, и для реализации алгоритмов случайного леса. В научных вычислениях он может быть использован для моделирования физических процессов, статистических симуляций и других задач.
Например, для случайного выбора n элементов из списка можно использовать такой код:
import numpy as np
def select_random_elements(data: list, n: int, rng: np.random.Generator) -> list:
"""Selects n random elements from a list using a specified random number generator.
Args:
data: The list to select from.
n: The number of elements to select.
rng: The NumPy Generator object to use for random number generation.
Returns:
A list containing the selected random elements.
"""
indices = rng.choice(len(data), size=n, replace=False)
return [data[i] for i in indices]
data = list(range(100))
rng = np.random.default_rng(123)
selected_elements = select_random_elements(data, 10, rng)
print(selected_elements)
Заключение
Краткий обзор рассмотренных методов и их особенностей
Мы рассмотрели различные методы генерации псевдослучайных чисел в NumPy, включая устаревшие функции rand(), randn(), randint(), random() и современный подход с использованием default_rng(). default_rng() предлагает лучшие статистические свойства, воспроизводимость и управление состоянием, что делает его предпочтительным выбором для большинства задач.
Перспективы развития модуля numpy.random
Модуль numpy.random продолжает развиваться, и в будущем можно ожидать появления новых алгоритмов и функций, которые будут обеспечивать еще более надежную и эффективную генерацию случайных чисел. Разработчики NumPy постоянно работают над улучшением статистических свойств и производительности генераторов, чтобы удовлетворить растущие потребности научного сообщества.