В настоящее время я пытаюсь понять, как я могу восстановить информацию о том, где мои данные расположены по оси x, после свертки с помощью numpy .convolve. По сути, я вычисляю вероятности Пуассона на (возможно, неоднородной) сетке x-значений потоков. Эти распределения также сдвинуты относительно друг друга. Общая цель - получить распределение вероятностей полного потока S_tot. Чтобы подробнее рассмотреть минимальный рабочий пример кода:
import numpy as np
from scipy.special import factorial
def poisson_prob(k, mu):
y = np.exp(-mu) * mu**k / factorial(k)
return y
#creating a list of values in logspace which is used to calculate the poisson probabilities, casting it onto interval [0,2]
S_bins = np.logspace(0,2,num=21)
S_bins = (S_bins/(max(S_bins)-min(S_bins))-min(S_bins)/(max(S_bins)-min(S_bins)))*2
#I will just give these values, it's not important how they are calculated
N_exp = np.array([0.23011479, 0.28907935, 0.36094939, 0.44453377, 0.53277289,
0.60856505, 0.64551186, 0.6219409 , 0.54114126, 0.43133697,
0.32312145, 0.23317077, 0.16499085, 0.11571718, 0.08091296,
0.0565679 , 0.03959174, 0.02775327, 0.01948579, 0.01370121])
S_bin_interpol_mean = [] #here I calculate the average of neighbouring elements of S_bins
for i in range(0, len(N_exp)):
S_bin_interpol_mean.append((S_bins[i]+S_bins[i+1])/2)
S_bin_interpol_mean = np.asarray(S_bin_interpol_mean)
poisson = [[0.0 for i in range(len(S_bins))] for j in range(len(N_exp))]
for i in range(0, len(N_exp)):
poisson[i] = poisson_prob(S_bins/S_bin_interpol_mean[i], N_exp[i])
poisson = np.asarray(poisson)
conv = poisson[0]
for i in range(0, len(N_exp)-1):
conv = np.convolve(conv, poisson[i+1], mode='full')
Список S_bins определяет рассматриваемые мной интервалы потоков; в этом примере он также служит входным списком для Пуассона, т. е. задается вопрос «для этого значения потока, насколько высока вероятность, что оно происходит исключительно из источников в пределах бункера i?». Он создается в logspace, потому что мои данные растягиваются на несколько порядков, поэтому linspace не будет работать, так как мне нужно правильно покрыть нижний предел. В любом случае я могу использовать другие списки значений в качестве входных данных для Пуассона, которые могут быть неравномерно распределены, он просто должен находиться в интервале [0,2] и должен обеспечивать значимую выборку Пуассона. Это всего лишь пример.
N_exp - это математическое ожидание mu наблюдаемых источников в пределах каждого бина потока, которое я использую в качестве входных данных для Пуассона. Здесь особо нечего сказать. Затем я вычисляю среднее значение соседних элементов в S_bins; этот массив содержит (примерно) средний поток источника в каждом бине. Следовательно, если я разделю входной список на величину потока на источник для этого бина, я получу количество источников k в этом бине, которое затем использую для Пуассона. (В этом случае k может не быть целым числом, однако я все равно перенормирую позже, и наблюдаемый полный поток является непрерывным распределением, поэтому давайте проигнорируем это.) Это также вызывает сдвиг различных распределений Пуассона.
Массив «пуассон» затем содержит вероятности наблюдения полного потока от S_bins с использованием источников только из одного элемента потока для каждого элемента. Если я сворачиваю их, это дает распределение вероятностей наблюдения полного потока S_tot.
Однако где на оси x находятся значения, полученные в результате свертки? Я знаю единицу измерения S_bins, но выходной массив намного длиннее моего ввода. Если я использую «то же самое» в качестве режима свертки, я получаю просто плоское распределение. Использование режима «полный» и построение графика дает именно то, что мне нужно, примерно гауссову форму, но мне нужно знать об оси x, и я до сих пор не знаю, как go об этом.