Как генерировать случайные числа из указанного распределения

машинное обучение искусственный интеллект Java Tomcat
Как генерировать случайные числа из указанного распределения

предисловие

Для случайных чисел мы обычно используем их чаще.Как правило, мы будем напрямую использовать случайные функции, которые поставляются с различными языками.Например, есть в c++.random()есть класс Random в java, модуль random в python и т.д. Все они легко генерируют случайные величины, но у них есть одна характеристика, то есть все они подчиняются равномерному распределению, а в некоторых сценариях необходимо генерировать случайные величины с разными распределениями.

Случайные переменные

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

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

Функция плотности вероятности

Он в основном используется для обозначения вероятности, соответствующей различным точкам, то есть вероятности, соответствующей каждой единице длины на оси X. Вероятность равна площади, и когда длина интервала стремится к 0, он становится точкой, а вероятность равна f(x).

общее распределение

  • Распределение Бернулли, то есть распределение 0-1, где случайная величина равна 0 или 1 с вероятностью p и 1-p.
  • Биномиальное распределение с n экспериментами Бернулли относительно вероятностей, соответствующих различным успехам.
  • Распределение Пуассона является предельной формой биномиального распределения.
  • Для равномерного распределения вероятности распределения по интервалам одинаковой длины равновероятны.
  • Нормальное распределение, также известное как распределение Гаусса, представляет собой колоколообразную нормальную кривую с нижними концами и высокой серединой.
  • Экспоненциальное распределение, которое описывает распределение вероятностей процесса, в котором события происходят непрерывно и независимо с постоянной средней скоростью.
  • Логистическое распределение, распределение роста, по форме похоже на нормальное распределение.

Алгоритмы генеративного распределения

  • Метод обратного преобразования: сначала сгенерируйте равномерно распределенное случайное число, затем найдите функцию распределения F(x) указанного распределения, а затем найдите обратную функцию G(x) для F(x) и приведите случайное число к обратному функция, которую нужно получить, представляет собой случайное число из указанного распределения.
  • Метод принятия-отклонения: сначала сгенерируйте равномерно распределенное случайное число a, установите функцию плотности вероятности равной f (x), а затем сгенерируйте равномерно распределенное случайное число b. Если b

выполнить

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

нормальное распределение

def normal_pdf(x, mu=0, sigma=1):
    return (1 / (math.sqrt(2 * math.pi) * sigma)) * (math.exp(-math.pow(x - mu, 2) / (2 * math.pow(sigma, 2))))
    
def standard_normal_rand():
    while True:
        a = random.uniform(-4.0, 4.0)
        b = random.uniform(0.0, 3.0)
        if b < normal_pdf(a):
            return a, b

这里写图片描述

распределение индекса

def exponential_pdf(x, lam=1):
    return lam * math.exp(-lam * x)
    
def exponential_rand():
    while True:
        a = random.uniform(0.0, 100.0)
        b = random.uniform(0.0, 3.0)
        if b <= exponential_pdf(a):
            return a, b

这里写图片描述

распределение Пуассона

def poisson_pdf(x, lam=1):
    return (math.pow(lam, x) / math.factorial(x)) * math.exp(-lam)

def poisson_rand():
    while True:
        a = random.randint(0, 50)
        b = random.uniform(0.0, 1.0)
        if b <= poisson_pdf(a):
            return a, b

这里写图片描述

github

https://github.com/sea-boat/MachineLearning_Lab/blob/master/distribution_gen.py

------------- Рекомендуем прочитать ------------

Резюме моей статьи за 2017 год — машинное обучение

Резюме моих статей за 2017 год — Java и промежуточное ПО

Резюме моих статей 2017 года — глубокое обучение

Краткое изложение моих статей за 2017 год — исходный код JDK

Резюме моей статьи за 2017 год — обработка естественного языка

Резюме моих статей 2017 года — Java Concurrency


Поговори со мной, задай мне вопросы:

这里写图片描述

Меню официальной учетной записи было разделено на «распределенное», «машинное обучение», «глубокое обучение», «НЛП», «глубина Java», «ядро параллелизма Java», «исходный код JDK», «ядро Tomcat», и т.д. Там может быть один стиль, чтобы удовлетворить ваш аппетит.

Зачем писать «Анализ проектирования ядра Tomcat»

Добро пожаловать, чтобы следовать:

这里写图片描述