Оцените доброту дистрибутивных припадок - PullRequest
1 голос
/ 17 апреля 2020

Я снабдил некоторые распределения для примеров данных следующим кодом:

import numpy as np 
import pylab
import matplotlib.pyplot as plt
from scipy.stats import norm

samp = norm.rvs(loc=0,scale=1,size=150) # (example) sample values. 

figprops = dict(figsize=(8., 7. / 1.618), dpi=128)                       
adjustprops = dict(left=0.1, bottom=0.1, right=0.97, top=0.93, wspace=0.2, hspace=0.2)

import pylab
fig = pylab.figure(**figprops)                                            
fig.subplots_adjust(**adjustprops)
ax = fig.add_subplot(1, 1, 1)  
ax.hist(samp,bins=10,density=True,alpha=0.6,color='grey', label='Data')
xmin, xmax = plt.xlim()

# Distributions. 
import scipy.stats
dist_names = ['beta', 'norm','gumbel_l'] 
for dist_name in dist_names:
    dist = getattr(scipy.stats, dist_name)
    param = dist.fit(samp)
    x = np.linspace(xmin, xmax, 100) # 
    ax.plot(x,dist(*param).pdf(x),linewidth=4,label=dist_name)

ax.legend(fontsize=14)
plt.savefig('example.png')

Как автоматически упорядочить имена распределений в легенде от наилучшего соответствия (вверху) до худшего соответствия? Я сгенерировал в al oop случайные величины, результат наилучшего соответствия может отличаться на каждой итерации.

1 Ответ

1 голос
/ 18 апреля 2020

Ну, вы можете использовать тест Колмогорова-Смирнова (KS) для вычисления, fe, p-значения и сортировки по нему

Изменение вашего l oop

for dist_name in dist_names:
    dist = getattr(scipy.stats, dist_name)
    param = dist.fit(samp)
    x = np.linspace(xmin, xmax, 100) # 
    ax.plot(x,dist(*param).pdf(x),linewidth=4,label=dist_name)

    ks = scipy.stats.kstest(samp, dist_name, args=param)
    print((dist_name, ks))

Вы можете получить в качестве вывода что-то вроде

('beta', KstestResult(statistic=0.033975289251035434, pvalue=0.9951529119440156))
('norm', KstestResult(statistic=0.03164417055025992, pvalue=0.9982475331007705))
('gumbel_l', KstestResult(statistic=0.113229070386386, pvalue=0.039394595923043355))

, которое говорит о том, что нормальный и бета-версии довольно хороши, но gumbel должен быть последним. Сортировка по P-значению или статистике должна быть легко добавляемой

Ваш результат может отличаться и зависеть от исходного состояния ГСЧ.

...