Как выполнить подгонку данных, чтобы найти распределение данных
Мне нужно выполнить подгонку данных, чтобы найти распределение данных.
Мне нужно найти функцию распределения PDF.
Я могу использовать функции подбора данных в Matlab и Python.
Похоже на усеченную гамму.
Но как найти параметры распределения?
Что если данные не вписываются в усеченную гамму?
График QQ (квантиль-квантиль) показывает, что он не подходит для усеченной гаммы.
Как найти параметры распределения, такие как альфа (форма), бета (масштаб) для усеченной гаммы?
Если сбор данных не может работать здесь, какие еще методы я могу использовать для этого?
Любая помощь будет оценена.
3 ответа
Проверьте allfitdist в Matlab.
В качестве альтернативы рассмотрите специальные пакеты, такие как ExpertFit или EasyFit. Статистическое программное обеспечение JMP также имеет довольно простой в использовании вариант подгонки распределения. Все они будут оценивать критерии соответствия, такие как Крамер-фон Мизес и оценки вероятности записи.
После того как вы выбрали функциональную форму распределения, значения параметров обычно оцениваются с помощью оценок максимального правдоподобия или метода моментов.
Если вы планируете использовать результаты в какой-либо модели симуляции, вы можете подумать о том, чтобы просто начать выборку, а не подгонять распределение. Еще одним вариантом симуляции будет запуск спроектированного эксперимента, в котором вы меняете выбор распределения и смотрите, оказывают ли альтернативы существенное влияние на ваши результаты, прежде чем слишком сильно беспокоиться о подборе правильного распределения.
The distfit
библиотека может все точки, которые вы просите. Он выполняет поиск по 89 теоретическим распределениям, чтобы найти лучшее с параметрами loc, scale arg. Пример:
Мне нужно выполнить подгонку данных, чтобы найти распределение заданных данных.
pip install distfit
from distfit import distfit
import numpy as np
# Create dataset
X = np.random.normal(0, 2, 1000)
# Default method is parametric.
dfit = distfit(distr='popular') # 'all' for all 89 or specify your own list.
# Search for best theoretical fit on your empirical data
results = dfit.fit_transform(X)
# [distfit] >INFO> fit
# [distfit] >INFO> transform
# [distfit] >INFO> [norm ] [0.00 sec] [RSS: 0.00221125] [loc=0.002 scale=1.902]
# [distfit] >INFO> [expon ] [0.00 sec] [RSS: 0.189094] [loc=-5.527 scale=5.529]
# [distfit] >INFO> [pareto ] [0.00 sec] [RSS: 0.189094] [loc=-536870917.527 scale=536870912.000]
# [distfit] >INFO> [dweibull ] [0.03 sec] [RSS: 0.00285214] [loc=0.005 scale=1.667]
# [distfit] >INFO> [t ] [0.18 sec] [RSS: 0.00221128] [loc=0.002 scale=1.902]
# [distfit] >INFO> [genextreme] [0.08 sec] [RSS: 0.00295224] [loc=-0.699 scale=1.892]
# [distfit] >INFO> [gamma ] [0.02 sec] [RSS: 0.00221712] [loc=-2156.094 scale=0.002]
# [distfit] >INFO> [lognorm ] [0.13 sec] [RSS: 0.00235342] [loc=-149.018 scale=149.010]
# [distfit] >INFO> [beta ] [0.03 sec] [RSS: 0.00208639] [loc=-11.915 scale=24.259]
# [distfit] >INFO> [uniform ] [0.00 sec] [RSS: 0.122291] [loc=-5.527 scale=11.639]
# [distfit] >INFO> [loggamma ] [0.06 sec] [RSS: 0.00209695] [loc=-376.616 scale=55.771]
# [distfit] >INFO> Compute confidence intervals [parametric]
fig, ax = plt.subplots(1, 2, figsize=(20, 10))
dfit.plot(chart='PDF', ax=ax[0])
dfit.plot(chart='CDF', ax=ax[1])
Лучшее соответствие можно найти в результатах, которые ответят на этот вопрос:
Мне нужно найти функцию pdf дистрибутива.
print(results['model'])
{'distr': <scipy.stats._continuous_distns.beta_gen at 0x155d67e35b0>,
'stats': 'RSS',
'params': (19.490647075756037,
20.18413144061353,
-11.915134641255602,
24.25907054997436),
'name': 'beta',
'model': <scipy.stats._distn_infrastructure.rv_continuous_frozen at 0x15583c00760>,
'score': 0.002086393123419647,
'loc': -11.915134641255602,
'scale': 24.25907054997436,
'arg': (19.490647075756037, 20.18413144061353),
'CII_min_alpha': -3.124111310171669,
'CII_max_alpha': 3.141196658807374}
Но как найти параметры распределения?
results['model']['params']
Что делать, если данные не могут хорошо соответствовать усеченной гамме?
# Take one of the other fitting models.
results['summary'][['distr', 'score']]
# Plot results
dfit.plot_summary()
График QQ (квантиль-квантиль) показывает, что он не подходит для усеченной гаммы.
# Make qqplot for the best fit.
dfit.qqplot(X)
# Inspect all other fits
dfit.qqplot(X, n_top=10)
Если подгонка данных здесь не работает, какие другие методы я могу использовать для этого?
Вы можете использовать непараметрические методы:
# Quantile method
dfit = distfit(method='quantile')
# Percentile method
dfit = distfit(method='percentile')
Любая помощь будет оценена по достоинству.
Отказ от ответственности: я также являюсь автором этого репо.
Возможно, этот пост может помочь.
Я представил пример того, как с помощью OpenTURNS найти наилучшее распределение по критерию BIC.
Вы определяете список "Заводы по распространению"
tested_distributions = [ot.WeibullMaxFactory(), ot.NormalFactory(), ot.UniformFactory()]
тогда ты звонишь
BestModelBIC
найти лучший вариант
best_model, best_bic = ot.FittingTest.BestModelBIC(sample, tested_distributions)
В настоящее время вы можете выбрать из 30 доступных "Фабрик" в OpenTURNS (см. Ниже). TruncatedNormalFactory доступен, но еще не TruncatedBetaFactory
print(ot.DistributionFactory.GetContinuousUniVariateFactories())
[Out]:
[ArcsineFactory,
BetaFactory,
BurrFactory,
ChiFactory,
ChiSquareFactory,
DirichletFactory,
ExponentialFactory,
FisherSnedecorFactory,
FrechetFactory,
GammaFactory,
GeneralizedParetoFactory,
GumbelFactory,HistogramFactory,
InverseNormalFactory,
LaplaceFactory,LogisticFactory,
LogNormalFactory,
LogUniformFactory,
MeixnerDistributionFactory,
NormalFactory,
ParetoFactory,
RayleighFactory,
RiceFactory,
StudentFactory,
TrapezoidalFactory,
TriangularFactory,
TruncatedNormalFactory,
UniformFactory,
WeibullMaxFactory,
WeibullMinFactory]
#30