Неисправная функция Poisson Fit на Python - PullRequest
0 голосов
/ 03 марта 2020

У меня проблемы с подгонкой пуассоновского распределения к моему набору данных. Я использовал этот процесс, чтобы уместить все мои другие наборы данных, и все оказалось хорошо, но по какой-то причине есть один набор, который не работает. Мой код выглядит следующим образом:

E3_comb1=n.array([835., 822., 880., 876., 855., 866., 827., 903., 881., 850., 885.,
       811., 873., 887., 921., 948., 808., 938., 881., 845.])

plt.hist(E3_comb1, bins=140, edgecolor='black')
plt.xlabel('Number of counts per bin')
plt.ylabel('Number of repetition')
plt.title('Amount of repetition of each number of counts per bin for Experiment 3, combined vertically')

Какой вывод этот сюжет; что я и ожидал. Теперь, чтобы вычислить мою подгонку по Пуассону, у меня есть:

entries, bin_edges, patches = plt.hist(E3_comb1, bins=140, range=[0, 950])
bin_middles = 0.5*(bin_edges[1:] + bin_edges[:-1])
parameters, cov_matrix = curve_fit(poisson, bin_middles, entries)

Где моя функция Пуассона определяется как:

def poisson(k, lamb):
    return (lamb**k/factorial(k)) * n.exp(-lamb)

Теперь мои значения для записей, ребер бина и середин бина: именно то, что я ожидал от них. Но по какой-то причине он выдает значение параметра 0,19; ie, в среднем 0,19, когда я ожидаю, что оно будет около 880. Действительно, если я построю свою подгонку Пуассона, используя:

plt.hist(E3_comb1, bins=140, edgecolor='black')
plt.plot(x, poisson(x, *parameters), '--r', label='poissonian fit')
plt.xlabel('Number of counts per bin')
plt.ylabel('Number of repetition')
plt.title('Amount of repetition of each number of counts per bin for Experiment 3, combined vertically')
plt.legend()

Это выдает this , что это не то, что я хотел, и ясно указывает, что что-то идет не так. Я попытался восстановить ошибку (и), но я не могу этого сделать. Я надеюсь, что вы сможете рассказать мне, как это исправить.

Поскольку я еще раз новичок в этом, я также надеюсь, что вы можете быть настолько ясны, насколько это возможно.

Спасибо всем очень много.

1 Ответ

0 голосов
/ 03 марта 2020

Похоже, вы ожидаете, что ваше распределение Пуассона будет иметь центр около 880. Однако функция curve_fit будет искать параметры со значениями по умолчанию порядка 1. Это можно изменить, добавив аргумент p0=guess в curve_fit, где guess - это кортеж всех ожидаемых значений вашей функции poisson. В вашем случае просто lamb.

Используя вашу функцию Пуассона и несколько фиктивных массивов, мы можем увидеть, какую форму нам следует ожидать, настроив параметр lamb:

x = n.arange(100)
plt.plot(x, poisson(x, 50))
plt.show()

A lamb = 50 дает распределение, которое имеет высоту 1e-16 в направлении y. Увеличение lamb около 880 приводит к y, который ниже 1e-40, поэтому очевидно, что это не сработает. Я бы порекомендовал поиграть с разными значениями lamb, построить результирующее распределение, найти то, которое близко к ожидаемому, и использовать это lamb в качестве предположения для подбора кривой. Тогда ваш пример будет выглядеть примерно так:

guess = (880)
parameters, cov_matrix = curve_fit(poisson, bin_middles, entries, p0=guess)

Из-за чрезвычайно малых значений, которые вы получите от функции poisson, когда lamb велико, вам, возможно, придется настроить poisson функция для добавления масштабирования или смещения y или x.

Дайте мне знать, если это поможет, и я смогу взглянуть на это еще немного после того, как вы исследуете.

...