Как я могу восстановить или сохранить x-значения после свертки с numpy? - PullRequest
0 голосов
/ 17 июня 2020

В настоящее время я пытаюсь понять, как я могу восстановить информацию о том, где мои данные расположены по оси 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 об этом.

...