Как я могу ограничить параметр формы в scipy.stats.genextreme.fit? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть следующий код, который отлично работает:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import genextreme as gev


def main(rvs):
    shape, loc, scale = gev.fit(rvs)
    return shape, loc, scale

if __name__ == '__main__':
    rvs = [9.4, 38.0, 12.5, 35.3, 17.6, 12.9, 12.4, 19.6, 15.0, 13.2, 12.3, 16.9, 16.9, 29.4, 13.6, 11.1, 8.0, 16.6, 12.0, 13.1, 9.1, 9.7, 21.0, 11.2, 14.4, 18.8, 14.0, 19.9, 12.4, 10.8, 21.6, 15.4, 17.4, 14.8, 22.7, 11.5, 10.5, 11.8, 12.4, 16.6, 11.7, 12.9, 17.8]
rvs = np.array(rvs, dtype=np.float32)
rvs -= rvs.min()


shape, loc, scale = main(rvs)

print(shape)
print(loc)
print(scale)



xx = np.linspace(rvs.min(), rvs.max(), num=100)
yy = gev.pdf(xx, shape, loc, scale)

hist, bins = np.histogram(rvs, bins=12, range=(rvs.min(), rvs.max()), density=True)
plt.bar(bins[:-1], hist, width = 2, align='edge')

plt.plot(xx, yy, 'ro')
plt.show()

Однако этот код производит распределение с правым хвостом, так как параметр формы настраивается на значение меньше 0.

Есть ли любой способ ограничить gev.fit() для получения shape, что больше 0? Это в основном потому, что я хочу предположить, что мои данные имеют левый хвост, хотя это может и не быть.

Я искал weibull_min и weibull_max, чтобы использовать их вместо genextreme. Однако, если я изменю строку

from scipy.stats import genextreme as gev

на

from scipy.stats import weibull_min as gev

, pdf вообще не будет соответствовать данным; скорее это становится дельта-функцией.

Не могли бы вы помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...