Если я не ошибаюсь, вы хотите найти режим подогнанных дистрибутивов вместо режима заданных данных. По сути, мы можем сделать это с помощью следующих 3 шагов:
Шаг 1: сгенерировать набор данных из распределения
from scipy import stats
from scipy.optimize import minimize
# generate a norm data with 0 mean and 1 variance
data = stats.norm.rvs(loc= 0,scale = 1,size = 100)
data[0:5]
Вывод:
массив ([1.76405235 , 0.40015721, 0.97873798, 2.2408932, 1.86755799])
Шаг 2: соответствовать параметрам
# fit the parameters of norm distribution
params = stats.norm.fit(data)
params
Выход:
(0,059808015534485, 1.0078822447165796)
Обратите внимание, что для stats.norm
есть 2 параметра, то есть loc
и scale
. Для разных dist в scipy.stats
параметры разные. Я думаю, что удобно хранить параметр в кортеже, а затем распаковать его на следующем шаге.
Шаг 3: получить режим (максимум вашей функции плотности) распределенного распределения
# continuous case
def your_density(x):
return -stats.norm.pdf(x,*paras)
minimize(your_density,0).x
Вывод:
0.05980794
Обратите внимание, что norm
распределение имеет mode
равно mean
. Это совпадение в этом примере.
Еще одна вещь заключается в том, что scipy
обрабатывает непрерывный dist и дискретный dist по-разному (у них разные классы отца), вы можете сделать то же самое с помощью следующего кода на дискретных дисках.
## discrete dist, example for poisson
x = np.arange(0,100) # the range of x should be specificied
x[stats.poisson.pmf(x,mu = 2).argmax()] # find the x value to maximize pmf
Out:
1
Вы можете попробовать свои собственные данные и дистрибутивы!