scipy.stats.rv_continuous.

fit#

rv_continuous.fit(данные, *args, **kwds)[источник]#

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

Начальные оценки для подгонки задаются входными аргументами; для любых аргументов без начальных оценок, self._fitstart(data) вызывается для генерации таких.

Можно зафиксировать некоторые параметры на определенных значениях, передав аргументы ключевых слов f0, f1, …, fn (для параметров формы) и floc и fscale (для параметров положения и масштаба, соответственно).

Параметры:
данныеarray_like или CensoredData экземпляр

Данные для оценки параметров распределения.

arg1, arg2, arg3,…floats, optional

Начальное значение(я) для любых аргументов, характеризующих форму (те, которые не предоставлены, будут определены вызовом _fitstart(data)). Значение по умолчанию отсутствует.

**kwdsfloats, optional
  • loc: начальное предположение о параметре положения распределения.

  • scale: начальное предположение о параметре масштаба распределения.

Специальные ключевые аргументы распознаются как содержащие определённые зафиксированные параметры:

  • f0…fn : фиксируют соответствующие параметры формы. Альтернативно, параметры формы для фиксации могут быть указаны по имени. Например, если self.shapes == "a, b", fa и fix_a эквивалентны f0, и fb и fix_b эквивалентны f1.

  • floc : фиксирует параметр местоположения на указанном значении.

  • fscale : зафиксировать параметр масштаба на указанном значении.

  • optimizer : Оптимизатор для использования. Оптимизатор должен принимать func и начальную позицию в качестве первых двух аргументов, плюс args (для дополнительных аргументов, передаваемых в оптимизируемую функцию) и disp. fit метод вызывает оптимизатор с disp=0 для подавления вывода. Оптимизатор должен возвращать оцененные параметры.

  • method : Метод для использования. По умолчанию "MLE" (оценка максимального правдоподобия); также доступен "MM" (метод моментов).

Возвращает:
parameter_tupleкортеж чисел с плавающей точкой

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

Вызывает:
TypeError, ValueError

Если входные данные недействительны

FitError

Если подгонка не удалась или полученная модель была бы недействительной

Примечания

С method="MLE" (по умолчанию) подгонка вычисляется путем минимизации функции отрицательного логарифма правдоподобия. Большое, конечное штрафное значение (вместо бесконечного отрицательного логарифма правдоподобия) применяется для наблюдений за пределами носителя распределения.

С method="MM", подгонка вычисляется путем минимизации нормы L2 относительных ошибок между первыми k сырые (около нуля) моменты данных и соответствующие моменты распределения, где k является количеством нефиксированных параметров. Более точно, целевая функция:

(((data_moments - dist_moments)
  / np.maximum(np.abs(data_moments), 1e-8))**2).sum()

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

Для любого метода, возвращаемый ответ не гарантируется глобально оптимальным; он может быть только локально оптимальным, или оптимизация может полностью завершиться неудачей. Если данные содержат любой из np.nan, np.inf, или -np.inf, fit метод вызовет RuntimeError.

При передаче CensoredData экземпляр для data, функция правдоподобия определяется как:

\[\begin{split}l(\pmb{\theta}; k) & = \sum \log(f(k_u; \pmb{\theta})) + \sum \log(F(k_l; \pmb{\theta})) \\ & + \sum \log(1 - F(k_r; \pmb{\theta})) \\ & + \sum \log(F(k_{\text{high}, i}; \pmb{\theta}) - F(k_{\text{low}, i}; \pmb{\theta}))\end{split}\]

где \(f\) и \(F\) являются pdf и cdf соответственно подгоняемой функции, \(\pmb{\theta}\) является вектором параметров, \(u\) являются индексами нецензурированных наблюдений, \(l\) являются индексами левоцензурированных наблюдений, \(r\) являются индексами право-цензурированных наблюдений, индексы "low"/"high" обозначают конечные точки интервально-цензурированных наблюдений, и \(i\) являются индексами интервально-цензурированных наблюдений.

Примеры

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

>>> import numpy as np
>>> from scipy.stats import beta
>>> a, b = 1., 2.
>>> rng = np.random.default_rng()
>>> x = beta.rvs(a, b, size=1000, random_state=rng)

Теперь мы можем подогнать все четыре параметра (a, b, loc и scale):

>>> a1, b1, loc1, scale1 = beta.fit(x)
>>> a1, b1, loc1, scale1
(1.0198945204435628, 1.9484708982737828, 4.372241314917588e-05, 0.9979078845964814)

Подгонку также можно выполнить с использованием пользовательского оптимизатора:

>>> from scipy.optimize import minimize
>>> def custom_optimizer(func, x0, args=(), disp=0):
...     res = minimize(func, x0, args, method="slsqp", options={"disp": disp})
...     if res.success:
...         return res.x
...     raise RuntimeError('optimization routine failed')
>>> a1, b1, loc1, scale1 = beta.fit(x, method="MLE", optimizer=custom_optimizer)
>>> a1, b1, loc1, scale1
(1.0198821087258905, 1.948484145914738, 4.3705304486881485e-05, 0.9979104663953395)

Мы также можем использовать некоторые априорные знания о наборе данных: давайте сохраним loc и scale исправлено:

>>> a1, b1, loc1, scale1 = beta.fit(x, floc=0, fscale=1)
>>> loc1, scale1
(0, 1)

Мы также можем зафиксировать параметры формы, используя f-keywords. Чтобы сохранить нулевой параметр формы a равно 1, используйте f0=1 или, что эквивалентно, fa=1:

>>> a1, b1, loc1, scale1 = beta.fit(x, fa=1, floc=0, fscale=1)
>>> a1
1

Не все распределения возвращают оценки для параметров формы. norm например, просто возвращает оценки для местоположения и масштаба:

>>> from scipy.stats import norm
>>> x = norm.rvs(a, b, size=1000, random_state=123)
>>> loc1, scale1 = norm.fit(x)
>>> loc1, scale1
(0.92087172783841631, 2.0015750750324668)