statistics — Функции математической статистики
Новая в версии 3.4.
Исходный код: Lib/statistics.py
Этот модуль предоставляет функции для вычисления математической статистики числовых (Real-значных) данных.
Модуль не предназначен для конкуренции с сторонними библиотеками, такими как NumPy, SciPy, или специализированными статистическими пакетами, ориентированными на профессиональных статистиков, такими как Minitab, SAS и Matlab. Он предназначен для использования на уровне графиков и научных калькуляторов.
Если не указано иное, эти функции поддерживают int, float, Decimal и Fraction. Поведение с другими типами (как в числовой иерархии, так и вне её) в настоящее время не поддерживается. Коллекции с различными типами данных также не определены и зависят от реализации. Если ваши входные данные содержат смешанные типы, вы можете использовать map(), чтобы гарантировать согласованный результат, например: map(float, input_data).
Средние значения и меры центральной тенденции
Эти функции вычисляют среднее или типичное значение из генеральной совокупности или выборки.
Среднее арифметическое (“среднее значение”) данных. | |
Быстрое среднее арифметическое с плавающей точкой. | |
Среднее геометрическое данных. | |
Среднее гармоническое данных. | |
Медиана (среднее значение) данных. | |
Низкая медиана данных. | |
Высокая медиана данных. | |
Медиана, или 50-й процентиль, сгруппированных данных. | |
Единственное моды (наиболее частое значение) дискретных или номинальных данных. | |
Список мод (наиболее частых значений) дискретных или номинальных данных. | |
Разделение данных на интервалы с равной вероятностью. |
Меры разброса
Эти функции вычисляют меру того, насколько генеральная совокупность или выборка имеют тенденцию отклоняться от типичных или средних значений.
Стандартное отклонение генеральной совокупности данных. | |
Дисперсия генеральной совокупности данных. | |
Стандартное отклонение выборки данных. | |
Дисперсия выборки данных. |
Подробности функций
Примечание: Функции не требуют, чтобы данные, предоставленные им, были отсортированы. Однако для удобства чтения в большинстве примеров показаны отсортированные последовательности.
-
statistics.mean(data) -
Возвращает выборочное среднее арифметическое значения data, которое может быть последовательностью или итерируемым объектом.
Среднее арифметическое — это сумма данных, делённая на количество точек данных. Его обычно называют «средним значением», хотя это лишь одно из многих различных математических средних. Это мера центральной тенденции данных.
Если data пусто, будет поднято исключение
StatisticsError.Примеры использования:
>>> mean([1, 2, 3, 4, 4]) 2.8 >>> mean([-1.0, 2.5, 3.25, 5.75]) 2.625 >>> from fractions import Fraction as F >>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)]) Fraction(13, 21) >>> from decimal import Decimal as D >>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")]) Decimal('0.5625')Примечание
Среднее значение сильно зависит от выбросов и не является надёжной оценкой центральной тенденции: среднее значение не обязательно является типичным примером точек данных. Для более надёжных мер центральной тенденции см.
median()иmode().Выборочное среднее даёт несмещённую оценку истинного среднего значения генеральной совокупности, так что при усреднении по всем возможным выборкам оно сходится к истинному среднему значению всей генеральной совокупности. Если data представляет собой всю генеральную совокупность, а не выборку, то это эквивалентно вычислению истинного среднего значения генеральной совокупности μ.
-
statistics.fmean(data) -
Преобразует data в числа с плавающей точкой и вычисляет среднее арифметическое.
Это выполняется быстрее, чем функция
mean(), и она всегда возвращает значение типаfloat. data может быть последовательностью или итерируемым объектом. Если входной набор данных пуст, возникает исключениеStatisticsError.>>> fmean([3.5, 4.0, 5.25]) 4.25
Добавлена в версии 3.8.
-
statistics.geometric_mean(data) -
Преобразует data в числа с плавающей точкой и вычисляет среднее геометрическое.
Среднее геометрическое показывает центральную тенденцию или типичное значение data, используя произведение значений (в отличие от среднего арифметического, которое использует их сумму).
Возбуждает исключение
StatisticsError, если входной набор данных пустой, содержит ноль или содержит отрицательное значение. data может быть последовательностью или итерируемым объектом.Не предпринимаются особые усилия для достижения точных результатов. (Однако это может измениться в будущем.)
>>> round(geometric_mean([54, 24, 36]), 1) 36.0
Добавлена в версии 3.8.
-
statistics.harmonic_mean(data) -
Возвращает гармоническое среднее значение data, последовательности или итерируемого объекта действительных чисел.
Гармоническое среднее, иногда называемое средним обратно пропорциональным, является обратной величиной арифметического
mean()обратных величин данных. Например, гармоническое среднее трёх значений a, b и c будет эквивалентно3/(1/a + 1/b + 1/c). Если одно из значений равно нулю, результат будет равен нулю.Гармоническое среднее является типом среднего, мерой центральной тенденции данных. Оно часто подходит для усреднения скоростей или коэффициентов, например, скоростей.
Предположим, автомобиль проезжает 10 км со скоростью 40 км/ч, а затем ещё 10 км со скоростью 60 км/ч. Какова средняя скорость?
>>> harmonic_mean([40, 60]) 48.0
Предположим, инвестор приобретает равную стоимость акций в каждой из трёх компаний с коэффициентами цена/прибыль (P/E) 2,5, 3 и 10. Каков средний коэффициент P/E для портфеля инвестора?
>>> harmonic_mean([2.5, 3, 10]) # For an equal investment portfolio. 3.6
Исключение
StatisticsErrorвозникает, если data пустое или какое-либо из элементов меньше нуля.Текущий алгоритм имеет выходную точку, когда он встречает ноль ввода. Это означает, что последующие вводы не проверяются на соответствие требованиям. (Это поведение может измениться в будущем.)
Добавлена в версии 3.6.
-
statistics.median(data) -
Возвращает медиану (среднее значение) числовых данных, используя общий метод «среднее из двух средних». Если data пусто, возбуждается исключение
StatisticsError. data может быть последовательностью или итерируемым объектом.Медиана — надёжная мера центральной тенденции и меньше зависит от наличия выбросов. Когда количество точек данных нечётно, возвращается средняя точка данных:
>>> median([1, 3, 5]) 3
Когда количество точек данных чётно, медиана интерполируется путём взятия среднего значения двух средних значений:
>>> median([1, 3, 5, 7]) 4.0
Это подходит для случаев, когда ваши данные дискретны, и вас не смущает, что медиана может не являться фактической точкой данных.
Если данные являются порядковыми (поддерживают операции упорядочения), но не числовыми (не поддерживают сложение), рассмотрите использование
median_low()илиmedian_high()вместо этого.
-
statistics.median_low(data) -
Возвращает нижнюю медиану числовых данных. Если data пусто, возбуждается исключение
StatisticsError. data может быть последовательностью или итерируемым объектом.Нижняя медиана всегда является членом набора данных. Когда количество точек данных нечётно, возвращается среднее значение. Когда оно чётно, возвращается меньшее из двух средних значений.
>>> median_low([1, 3, 5]) 3 >>> median_low([1, 3, 5, 7]) 3
Используйте нижнюю медиану, когда ваши данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.
-
statistics.median_high(data) -
Возвращает верхнюю медиану данных. Если data пусто, возбуждается исключение
StatisticsError. data может быть последовательностью или итерируемым объектом.Верхняя медиана всегда является членом набора данных. Когда количество точек данных нечётно, возвращается среднее значение. Когда оно чётно, возвращается большее из двух средних значений.
>>> median_high([1, 3, 5]) 3 >>> median_high([1, 3, 5, 7]) 5
Используйте верхнюю медиану, когда ваши данные дискретны и вы предпочитаете, чтобы медиана была фактической точкой данных, а не интерполированной.
-
statistics.median_grouped(data, interval=1) -
Возвращает медиану сгруппированных непрерывных данных, вычисленную как 50-й процентиль с использованием интерполяции. Если data пусто, возбуждается исключение
StatisticsError. data может быть последовательностью или итерируемым объектом.>>> median_grouped([52, 52, 53, 54]) 52.5
В следующем примере данные округляются, так что каждое значение представляет собой середину классов данных, например, 1 — середина класса 0,5–1,5, 2 — середина 1,5–2,5, 3 — середина 2,5–3,5 и т. д. С учётом данных, среднее значение находится где-то в классе 3,5–4,5, и для его оценки используется интерполяция:
>>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) 3.7
Необязательный аргумент interval представляет собой интервал класса и по умолчанию равен 1. Изменение интервала класса естественным образом изменит интерполяцию:
>>> median_grouped([1, 3, 3, 5, 7], interval=1) 3.25 >>> median_grouped([1, 3, 3, 5, 7], interval=2) 3.5
Функция не проверяет, находятся ли точки данных по крайней мере на расстоянии interval друг от друга.
Детали реализации CPython: В некоторых обстоятельствах
median_grouped()может привести к преобразованию точек данных в числа с плавающей точкой. Это поведение, вероятно, изменится в будущем.См. также
- «Статистика для гуманитарных наук», Фредерик Дж. Граветтер и Ларри Б. Уоллно (8-е издание).
- Функция SSMEDIAN в электронных таблицах Gnome Gnumeric, включая данное обсуждение.
-
statistics.mode(data) -
Возвращает самую часто встречающуюся точку данных из дискретных или номинальных data. Мода (если она существует) — это наиболее типичное значение и служит мерой центральной тенденции.
Если существует несколько мод с одинаковой частотой, возвращается первая, встреченная в data. Если вместо этого требуется наименьшая или наибольшая из них, используйте
min(multimode(data))илиmax(multimode(data)). Если входные data пустые, возбуждается исключениеStatisticsError.modeпредполагает дискретные данные и возвращает одно значение. Это стандартная обработка моды, как это обычно преподаётся в школах:>>> mode([1, 1, 2, 3, 3, 3, 3, 4]) 3
Мода уникальна тем, что это единственная статистика в этом пакете, которая также применима к номинальным (не числовым) данным:
>>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red'
Изменено в версии 3.8: Теперь обрабатывает многомодальные наборы данных, возвращая первую встреченную моду. Раньше при обнаружении более одной моды возбуждалось исключение
StatisticsError.
-
statistics.multimode(data) -
Возвращает список наиболее часто встречающихся значений в порядке их первого появления в data. Возвращает более одного результата, если имеется несколько мод, или пустой список, если data пусто:
>>> multimode('aabbbbccddddeeffffgg') ['b', 'd', 'f'] >>> multimode('') []Добавлена в версии 3.8.
-
statistics.pstdev(data, mu=None) -
Возвращает стандартное отклонение генеральной совокупности (квадратный корень из дисперсии генеральной совокупности). Смотрите
pvariance()для аргументов и других деталей.>>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 0.986893273527251
-
statistics.pvariance(data, mu=None) -
Возвращает дисперсию генеральной совокупности data, непустой последовательности или итерируемого объекта вещественных чисел. Дисперсия, или второй момент относительно среднего, является мерой изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные распределены широко; малая дисперсия указывает на то, что данные сгруппированы близко вокруг среднего.
Если задан необязательный второй аргумент mu, он обычно представляет собой среднее значение data. Его также можно использовать для вычисления второго момента относительно точки, которая не является средним значением. Если он отсутствует или
None(по умолчанию), вычисляется среднее арифметическое.Используйте эту функцию для вычисления дисперсии по всей генеральной совокупности. Для оценки дисперсии по выборке, как правило, лучше использовать функцию
variance().Возникает исключение
StatisticsError, если data пуста.Примеры:
>>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25] >>> pvariance(data) 1.25
Если вы уже вычислили среднее значение своих данных, вы можете передать его в качестве необязательного второго аргумента mu, чтобы избежать повторного вычисления:
>>> mu = mean(data) >>> pvariance(data, mu) 1.25
Поддерживаются десятичные числа и дроби:
>>> from decimal import Decimal as D >>> pvariance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) Decimal('24.815') >>> from fractions import Fraction as F >>> pvariance([F(1, 4), F(5, 4), F(1, 2)]) Fraction(13, 72)Примечание
При вызове с полной генеральной совокупностью это даёт дисперсию генеральной совокупности σ². При вызове по выборке, это смещённая выборочная дисперсия s², также известная как дисперсия с N степенями свободы.
Если вам каким-то образом известен истинный средний показатель μ генеральной совокупности, вы можете использовать эту функцию для расчёта дисперсии выборки, указав известное среднее значение генеральной совокупности в качестве второго аргумента. При условии, что данные являются случайной выборкой генеральной совокупности, результат будет несмещённой оценкой дисперсии генеральной совокупности.
-
statistics.stdev(data, xbar=None) -
Возвращает стандартное отклонение выборки (квадратный корень из дисперсии выборки). Смотрите
variance()для аргументов и других деталей.>>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75]) 1.0810874155219827
-
statistics.variance(data, xbar=None) -
Возвращает дисперсию выборки data, итерируемого объекта, содержащего не менее двух вещественных чисел. Дисперсия, или второй момент относительно среднего, является мерой изменчивости (разброса или рассеяния) данных. Большая дисперсия указывает на то, что данные распределены широко; малая дисперсия указывает на то, что данные сгруппированы близко вокруг среднего.
Если задан необязательный второй аргумент xbar, он должен представлять собой среднее значение data. Если он отсутствует или
None(по умолчанию), вычисляется среднее значение.Используйте эту функцию, когда ваши данные являются выборкой из генеральной совокупности. Чтобы вычислить дисперсию по всей генеральной совокупности, см.
pvariance().Возникает исключение
StatisticsError, если data содержит меньше двух значений.Примеры:
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5] >>> variance(data) 1.3720238095238095
Если вы уже вычислили среднее значение своих данных, вы можете передать его в качестве необязательного второго аргумента xbar, чтобы избежать повторного вычисления:
>>> m = mean(data) >>> variance(data, m) 1.3720238095238095
Эта функция не пытается проверить, передали ли вы фактическое среднее значение как xbar. Использование произвольных значений для xbar может привести к недействительным или невозможным результатам.
Поддерживаются десятичные и дробные значения:
>>> from decimal import Decimal as D >>> variance([D("27.5"), D("30.25"), D("30.25"), D("34.5"), D("41.75")]) Decimal('31.01875') >>> from fractions import Fraction as F >>> variance([F(1, 6), F(1, 2), F(5, 3)]) Fraction(67, 108)Примечание
Это выборочная дисперсия s² с поправкой Бесселя, также известная как дисперсия с N-1 степенями свободы. При условии, что данные являются репрезентативными (например, независимыми и одинаково распределёнными), результат должен быть несмещённой оценкой истинной дисперсии генеральной совокупности.
Если вам каким-то образом известно фактическое среднее значение генеральной совокупности μ, вы должны передать его в функцию
pvariance()в качестве параметра mu, чтобы получить дисперсию выборки.
-
statistics.quantiles(data, *, n=4, method='exclusive') -
Разделяет data на n непрерывных интервалов с равной вероятностью. Возвращает список
n - 1точек разбиения, разделяющих интервалы.Установите n в 4 для квартилей (по умолчанию). Установите n в 10 для децилей. Установите n в 100 для перцентилей, что даёт 99 точек разбиения, разделяющих data на 100 равных групп. Возникает исключение
StatisticsError, если n не меньше 1.data может быть любым итерируемым объектом, содержащим данные выборки. Для получения осмысленных результатов количество точек данных в data должно быть больше, чем n. Возникает исключение
StatisticsError, если нет по крайней мере двух точек данных.Точки разбиения линейно интерполируются из двух ближайших точек данных. Например, если точка разбиения находится на одной трети расстояния между двумя значениями выборки,
100и112, то точка разбиения будет равна104.Метод вычисления квантилей может изменяться в зависимости от того, включает ли data минимальное и максимальное возможное значения из генеральной совокупности или нет.
По умолчанию method равен “exclusive” и используется для данных, взятых из генеральной совокупности, которая может иметь значения, более экстремальные, чем те, которые найдены в выборке. Доля генеральной совокупности, попадающая ниже i-й из m отсортированных точек данных, вычисляется как
i / (m + 1). Взяв девять значений выборки, метод сортирует их и присваивает следующие перцентили: 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%.Установка method в “inclusive” используется для описания данных генеральной совокупности или для выборок, которые, как известно, включают самые крайние значения из генеральной совокупности. Минимальное значение в data обрабатывается как 0-й перцентиль, а максимальное значение — как 100-й перцентиль. Доля генеральной совокупности, попадающая ниже i-й из m отсортированных точек данных, вычисляется как
(i - 1) / (m - 1). Взяв 11 значений выборки, метод сортирует их и присваивает следующие перцентили: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100%.# Decile cut points for empirically sampled data >>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110, ... 100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129, ... 106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86, ... 111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95, ... 103, 107, 101, 81, 109, 104] >>> [round(q, 1) for q in quantiles(data, n=10)] [81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]
New in version 3.8.
Исключения
Определено одно исключение:
-
exception statistics.StatisticsError -
Подкласс
ValueErrorдля исключений, связанных со статистикой.
Объекты NormalDist
NormalDist — инструмент для создания и манипулирования нормальными распределениями случайной переменной. Это класс, который обрабатывает среднее значение и стандартное отклонение данных измерений как единое целое.
Нормальные распределения возникают из теоремы центральной предельной и имеют широкий спектр применений в статистике.
-
class statistics.NormalDist(mu=0.0, sigma=1.0) -
Возвращает новый объект NormalDist, где mu представляет среднее арифметическое, а sigma — стандартное отклонение.
Если sigma отрицательное, генерирует
StatisticsError.-
mean -
Только для чтения свойство для среднего арифметического нормального распределения.
-
median -
Только для чтения свойство для медианы нормального распределения.
-
mode -
Только для чтения свойство для моды нормального распределения.
-
stdev -
Только для чтения свойство для стандартного отклонения нормального распределения.
-
variance -
Только для чтения свойство для дисперсии нормального распределения. Равно квадрату стандартного отклонения.
-
classmethod from_samples(data) -
Создает экземпляр нормального распределения с параметрами mu и sigma, оцененными по data с использованием
fmean()иstdev().data может быть любым итерируемым объектом и должен содержать значения, которые можно преобразовать в тип
float. Если data не содержит хотя бы двух элементов, генерируетсяStatisticsError, так как для оценки центрального значения требуется хотя бы одна точка, а для оценки дисперсии — по крайней мере две точки.
-
samples(n, *, seed=None) -
Генерирует n случайных выборок для заданного среднего значения и стандартного отклонения. Возвращает
listзначений типаfloat.Если задан seed, создает новый экземпляр генератора случайных чисел. Это полезно для создания воспроизводимых результатов, даже в многопоточном контексте.
-
pdf(x) -
Используя функцию плотности вероятности (pdf), вычислить относительную вероятность того, что случайная переменная X будет близка к заданному значению x. Математически, это предел отношения
P(x <= X < x+dx) / dxпо мере приближения dx к нулю.Относительная вероятность вычисляется как вероятность возникновения выборки в узком диапазоне, деленная на ширину диапазона (отсюда и слово «плотность»). Поскольку вероятность относительна другим точкам, ее значение может быть больше
1.0.
-
cdf(x) -
Используя функцию распределения (cdf), вычислить вероятность того, что случайная переменная X будет меньше или равна x. Математически записывается как
P(X <= x).
-
inv_cdf(p) -
Вычислить обратную функцию распределения, также известную как функция квантиля или функция процентилей. Математически записывается как
x : P(X <= x) = p.Находит значение x случайной переменной X такое, что вероятность того, что переменная будет меньше или равна этому значению, равна заданной вероятности p.
-
overlap(other) -
Измеряет согласованность между двумя нормальными распределениями вероятностей. Возвращает значение от 0,0 до 1,0, дающее перекрывающуюся площадь для двух функций плотности вероятности.
-
quantiles(n=4) -
Разбивает нормальное распределение на n непрерывных интервалов с равной вероятностью. Возвращает список (n - 1) точек раздела, разделяющих интервалы.
Установите n в 4 для квартилей (по умолчанию). Установите n в 10 для децилей. Установите n в 100 для перцентилей, что дает 99 точек раздела, разделяющих нормальное распределение на 100 равных групп.
Экземпляры
NormalDistподдерживают сложение, вычитание, умножение и деление на константу. Эти операции используются для перевода и масштабирования. Например:>>> temperature_february = NormalDist(5, 2.5) # Celsius >>> temperature_february * (9/5) + 32 # Fahrenheit NormalDist(mu=41.0, sigma=4.5)
Деление константы на экземпляр
NormalDistне поддерживается, потому что результат не будет иметь нормальное распределение.Поскольку нормальные распределения возникают из аддитивных эффектов независимых переменных, можно сложить и вычесть две независимые нормально распределённые случайные величины, представленные экземплярами
NormalDist. Например:>>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5]) >>> drug_effects = NormalDist(0.4, 0.15) >>> combined = birth_weights + drug_effects >>> round(combined.mean, 1) 3.1 >>> round(combined.stdev, 1) 0.5
Новое в версии 3.8.
-
NormalDist Примеры и рецепты
NormalDist легко решает классические задачи теории вероятностей.
Например, учитывая исторические данные по экзаменам SAT, показывающие, что баллы распределены нормально со средним значением 1060 и стандартным отклонением 195, определите процент студентов с баллами между 1100 и 1200, округлив до ближайшего целого числа:
>>> sat = NormalDist(1060, 195) >>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5) >>> round(fraction * 100.0, 1) 18.4
Найдите квартили и децили для баллов SAT:
>>> list(map(round, sat.quantiles())) [928, 1060, 1192] >>> list(map(round, sat.quantiles(n=10))) [810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]
Для оценки распределения для модели, которую нелегко решить аналитически, NormalDist может генерировать входные выборки для моделирования Монте-Карло:
>>> def model(x, y, z): ... return (3*x + 7*x*y - 5*y) / (11 * z) ... >>> n = 100_000 >>> X = NormalDist(10, 2.5).samples(n, seed=3652260728) >>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471) >>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453) >>> quantiles(map(model, X, Y, Z)) [1.4591308524824727, 1.8035946855390597, 2.175091447274739]
Нормальные распределения могут использоваться для приближения биномиальных распределений, когда размер выборки велик, а вероятность успешного испытания близка к 50%.
Например, на конференции с открытым исходным кодом участвует 750 человек, и есть два зала вместимостью 500 человек. Одна лекция о Python, другая о Ruby. На предыдущих конференциях 65% участников предпочитали слушать лекции о Python. Предполагая, что предпочтения населения не изменились, какова вероятность того, что зал Python останется в пределах своей вместимости?
>>> n = 750 # Sample size
>>> p = 0.65 # Preference for Python
>>> q = 1.0 - p # Preference for Ruby
>>> k = 500 # Room capacity
>>> # Approximation using the cumulative normal distribution
>>> from math import sqrt
>>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)
0.8402
>>> # Solution using the cumulative binomial distribution
>>> from math import comb, fsum
>>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)
0.8402
>>> # Approximation using a simulation
>>> from random import seed, choices
>>> seed(8675309)
>>> def trial():
... return choices(('Python', 'Ruby'), (p, q), k=n).count('Python')
>>> mean(trial() <= k for i in range(10_000))
0.8398
Нормальные распределения часто встречаются в задачах машинного обучения.
В Википедии есть хороший пример классификатора Наивного Байеса. Задача заключается в предсказании пола человека по измерениям нормально распределенных характеристик, включая рост, вес и размер ноги.
Нам даны данные тренировочной выборки с измерениями для восьми человек. Измерения предполагаются нормально распределёнными, поэтому мы обобщаем данные с помощью NormalDist:
>>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92]) >>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75]) >>> weight_male = NormalDist.from_samples([180, 190, 170, 165]) >>> weight_female = NormalDist.from_samples([100, 150, 130, 150]) >>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10]) >>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])
Затем мы встречаем нового человека, чьи измерения характеристик известны, но пол неизвестен:
>>> ht = 6.0 # height >>> wt = 130 # weight >>> fs = 8 # foot size
Начиная с 50% предварительной вероятности быть мужчиной или женщиной, мы вычисляем апостериорную вероятность как предварительную вероятность, умноженную на произведение вероятностей для измерений характеристик при данном поле:
>>> prior_male = 0.5 >>> prior_female = 0.5 >>> posterior_male = (prior_male * height_male.pdf(ht) * ... weight_male.pdf(wt) * foot_size_male.pdf(fs)) >>> posterior_female = (prior_female * height_female.pdf(ht) * ... weight_female.pdf(wt) * foot_size_female.pdf(fs))
Окончательное предсказание относится к наибольшей апостериорной вероятности. Это известно как максимальное апостериорное оценивание (MAP):
>>> 'male' if posterior_male > posterior_female else 'female' 'female'
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/statistics.html