предисловие
Для случайных чисел мы обычно используем их чаще.Как правило, мы будем напрямую использовать случайные функции, которые поставляются с различными языками.Например, есть в 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»
Добро пожаловать, чтобы следовать: