У меня есть набор данных, который я знаю, имеет распределение Pareto. Кто-то может указать на меня на то, как приспособить этот набор данных в Scipy? Я заставил ниже кода работать, но я понятия не имею, что возвращается мне (a, b, c). Кроме того, после получения a, b, c, как я вычисляю различие с помощью них?
import scipy.stats as ss
import scipy as sp
a,b,c=ss.pareto.fit(data)
Будьте очень внимательны при подборе степенных законов !! Многие известные степенные законы на самом деле плохо соответствуют степенным законам. См. Clauset et al. для получения всех подробностей (также на arxiv , если у вас нет доступа к журналу). У них есть сопутствующий веб-сайт к статье, которая теперь ссылается на реализацию Python. Не знаю, использует ли он Scipy, потому что я использовал их реализацию на R в последний раз.
Вот быстро написанная версия, основанная на некоторых подсказках из справочной страницы, которую дал Руперт. В настоящее время эта работа ведется в scipy и statsmodels и требует MLE с некоторыми фиксированными или фиксированными параметрами, которые доступны только в основных версиях. Стандартных ошибок в оценках параметров или другой статистике результатов пока нет.
'''estimating pareto with 3 parameters (shape, loc, scale) with nested
minimization, MLE inside minimizing Kolmogorov-Smirnov statistic
running some examples looks good
Author: josef-pktd
'''
import numpy as np
from scipy import stats, optimize
#the following adds my frozen fit method to the distributions
#scipy trunk also has a fit method with some parameters fixed.
import scikits.statsmodels.sandbox.stats.distributions_patch
true = (0.5, 10, 1.) # try different values
shape, loc, scale = true
rvs = stats.pareto.rvs(shape, loc=loc, scale=scale, size=1000)
rvsmin = rvs.min() #for starting value to fmin
def pareto_ks(loc, rvs):
est = stats.pareto.fit_fr(rvs, 1., frozen=[np.nan, loc, np.nan])
args = (est[0], loc, est[1])
return stats.kstest(rvs,'pareto',args)[0]
locest = optimize.fmin(pareto_ks, rvsmin*0.7, (rvs,))
est = stats.pareto.fit_fr(rvs, 1., frozen=[np.nan, locest, np.nan])
args = (est[0], locest[0], est[1])
print 'estimate'
print args
print 'kstest'
print stats.kstest(rvs,'pareto',args)
print 'estimation error', args - np.array(true)