scipy.stats.

fit#

scipy.stats.fit(dist, данные, bounds=None, *, guess=None, method='mle', optimizer= differential_evolution>)[источник]#

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

Для заданного распределения, данных и границ параметров распределения верните оценки максимального правдоподобия параметров.

Параметры:
distscipy.stats.rv_continuous или scipy.stats.rv_discrete

Объект, представляющий распределение, которое нужно подогнать к данным.

данные1D array_like

Данные, к которым распределение должно быть подогнано. Если данные содержат любой из np.nan, np.inf, или -np.inf, метод fit вызовет ValueError.

границыdict или последовательность кортежей, опционально

Если словарь, каждый ключ — это имя параметра распределения, а соответствующее значение — кортеж, содержащий нижнюю и верхнюю границы для этого параметра. Если распределение определено только для конечного диапазона значений этого параметра, запись для этого параметра не требуется; например, некоторые распределения имеют параметры, которые должны находиться в интервале [0, 1]. Границы для параметров location (loc) и масштаб (scale) являются опциональными; по умолчанию они фиксированы как 0 и 1 соответственно.

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

Если форма должна оставаться фиксированной (например, если она известна), нижняя и верхняя границы могут быть равны. Если предоставленная пользователем нижняя или верхняя граница выходит за пределы области определения распределения, граница области определения распределения заменит предоставленное пользователем значение. Аналогично, параметры, которые должны быть целочисленными, будут ограничены целочисленными значениями в пределах предоставленных пользователем границ.

предположениеdict или array_like, опционально

Если словарь, каждый ключ — это имя параметра распределения, а соответствующее значение — предположение о значении параметра.

Если последовательность, элемент i является предположением для ith параметр распределения. В этом случае предположения для все параметры формы распределения должны быть предоставлены.

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

метод{‘mle’, ‘mse’}

С method="mle" (по умолчанию), подгонка вычисляется путём минимизации функции отрицательного логарифма правдоподобия. Большое конечное штрафное значение (вместо бесконечного отрицательного логарифма правдоподобия) применяется для наблюдений за пределами области определения распределения. При method="mse", подгонка вычисляется путем минимизации функции отрицательного логарифма произведения интервалов. Такое же штрафное значение применяется для наблюдений за пределами области определения. Мы следуем подходу [1], который обобщен для выборок с повторяющимися наблюдениями.

оптимизаторвызываемый объект, необязательный

оптимизатор является вызываемым объектом, который принимает следующий позиционный аргумент.

funcallable

Целевая функция для оптимизации. fun принимает один аргумент x, кандидаты параметров формы распределения, и возвращает значение целевой функции, заданное x, dist, и предоставленный данные. Задача оптимизатор заключается в нахождении значений переменных решения, которые минимизируют fun.

оптимизатор также должен принимать следующий именованный аргумент.

границыпоследовательность кортежей

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

Если предположение предоставлен, оптимизатор также должен принимать следующий ключевой аргумент.

x0array_like

Начальные приближения для каждой переменной решения.

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

integralityarray_like булевых значений

Для каждой переменной решения: True, если переменная решения должна быть ограничена целочисленными значениями, и False, если переменная решения является непрерывной.

оптимизатор должен возвращать объект, например, экземпляр scipy.optimize.OptimizeResult, который хранит оптимальные значения переменных решения в атрибуте x. Если атрибуты fun, status, или message предоставлены, они будут включены в объект результата, возвращаемый fit.

Возвращает:
результатFitResult

Объект со следующими полями.

paramsnamedtuple

Именованный кортеж, содержащий оценки максимального правдоподобия параметров формы, местоположения и (если применимо) масштаба распределения.

successbool или None

Считал ли оптимизатор оптимизацию успешно завершённой или нет.

messagestr или None

Любое сообщение о статусе, предоставленное оптимизатором.

Объект имеет следующий метод:

nllf(params=None, data=None)

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

plot(ax=None)

Накладывает PDF/PMF подобранного распределения на нормализованную гистограмму данных.

Смотрите также

rv_continuous, rv_discrete

Примечания

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

Ссылки

[1]

Shao, Yongzhao, and Marjorie G. Hahn. “Maximum product of spacings method: a unified formulation with illustration of strong consistency.” Illinois Journal of Mathematics 43.3 (1999): 489-499.

Примеры

Предположим, мы хотим подогнать распределение к следующим данным.

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> dist = stats.nbinom
>>> shapes = (5, 0.5)
>>> data = dist.rvs(*shapes, size=1000, random_state=rng)

Предположим, мы не знаем, как были сгенерированы данные, но подозреваем, что они следуют отрицательному биномиальному распределению с параметрами n и p. (См. scipy.stats.nbinom.) Мы считаем, что параметр n было меньше 30, и мы знаем, что параметр p должен лежать на интервале [0, 1]. Мы записываем эту информацию в переменную границы и передать эту информацию в fit.

>>> bounds = [(0, 30), (0, 1)]
>>> res = stats.fit(dist, data, bounds)

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

>>> res.params
FitParams(n=5.0, p=0.5028157644634368, loc=0.0)  # may vary

Мы можем визуализировать результаты, наложив функцию вероятности распределения (с формами, подобранными к данным) на нормализованную гистограмму данных.

>>> import matplotlib.pyplot as plt  # matplotlib must be installed to plot
>>> res.plot()
>>> plt.show()
../../_images/scipy-stats-fit-1_00_00.png

Обратите внимание, что оценка для n был точно целочисленным; это потому, что область определения nbinom PMF включает только целочисленные nдолжны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN nbinom объект «знает», что. nbinom также знает, что форма p должно быть значением между 0 и 1. В таком случае - когда область определения распределения относительно параметра конечна - нам не требуется указывать границы для параметра.

>>> bounds = {'n': (0, 30)}  # omit parameter p using a `dict`
>>> res2 = stats.fit(dist, data, bounds)
>>> res2.params
FitParams(n=5.0, p=0.5016492009232932, loc=0.0)  # may vary

Если мы хотим заставить распределение быть подобранным с n зафиксировано на 6, мы можем установить как нижнюю, так и верхнюю границы для n до 6. Однако обратите внимание, что значение оптимизируемой целевой функции обычно хуже (выше) в этом случае.

>>> bounds = {'n': (6, 6)}  # fix parameter `n`
>>> res3 = stats.fit(dist, data, bounds)
>>> res3.params
FitParams(n=6.0, p=0.5486556076755706, loc=0.0)  # may vary
>>> res3.nllf() > res.nllf()
True  # may vary

Обратите внимание, что численные результаты предыдущих примеров типичны, но они могут варьироваться, поскольку используемый по умолчанию оптимизатор в fit, scipy.optimize.differential_evolution, является стохастическим. Однако мы можем настроить параметры, используемые оптимизатором, чтобы обеспечить воспроизводимость - или даже использовать другой оптимизатор - с помощью оптимизатор параметр.

>>> from scipy.optimize import differential_evolution
>>> rng = np.random.default_rng()
>>> def optimizer(fun, bounds, *, integrality):
...     return differential_evolution(fun, bounds, strategy='best2bin',
...                                   rng=rng, integrality=integrality)
>>> bounds = [(0, 30), (0, 1)]
>>> res4 = stats.fit(dist, data, bounds, optimizer=optimizer)
>>> res4.params
FitParams(n=5.0, p=0.5015183149259951, loc=0.0)