Какая ошибка в значении, соответствующем максимуму функции? - PullRequest
1 голос
/ 06 апреля 2020

Это моя проблема:

Первый вход - это данные наблюдений MUSE, который является астрономическим инструментом и предоставляет кубы, то есть изображение для каждой длины волны с определенным диапазоном. Это означает, что, взяв все длины волн, соответствующие пикселю i,j, я могу извлечь спектр для этого пикселя. Так как эти изображения наблюдаются, для каждого пикселя у меня есть ошибка.

Второй вход представляет собой шаблон спектра, то есть модель спектра. Предполагается, что этот шаблон без ошибок. Я отображаю эти спектры с различным красным смещением (это означает умножение длины волны на коэффициент 1+z, где z принадлежат к определенному диапазону).

Суть моего кода - это взаимная корреляция между кубом, то есть спектрами, извлеченными из каждого пикселя, и шаблоном, отображаемым с различным красным смещением. Результатом является функция взаимной корреляции для каждого пикселя для каждого z, давайте назовем эту вычисленную функцию как f(z). Взяв для каждого пикселя argmax f(z), я получаю лучшее красное смещение. Это распространенный и широко используемый процесс, действительно, он действительно работает хорошо.

Мой вопрос:

Поскольку мой ввод, то есть куб MUSE, содержит ошибку, я распространил эту ошибку через взаимную корреляцию, получая ошибку на f(z), т.е. каждый f_i имеет ошибку sigma_i. Итак, как я могу вычислить ошибку на z_max, которая является значением z, соответствующим максимуму f?

Возможно, решением может быть реализация метода bootstrap: с ошибкой f я могу извлечь определенное количество функций, для каждой из которых я вычислил argamx, поэтому я может иметь представление о разбросе z_max.

Кстати, я использую python (3.x) и tensorflow был использован для вычисления функции взаимной корреляции.

Спасибо!

РЕДАКТИРОВАТЬ Следуя совету @TF_Support, я пытаюсь добавить код и цифры, чтобы лучше понять проблему. Но перед этим, может быть, лучше немного математики.

С этим выражением я вычислил взаимную корреляцию:

xcorr

где S - спектры, T - шаблон, а N - коэффициент нормализации. Так как S имеет ошибку, я распространял эти ошибки через основание предыдущего отношения:

enter image description here

, где SST_k - сумма шаблон в квадрате и sigma_ij - ошибка на S_ij (на самом деле, я должен был написать sigma_S_ij).

Следующая функция (реализованная с tensorflow 2.1) устанавливает взаимную корреляцию между одним шаблоном и спектрами batch пикселей и вычисляет ошибку функции взаимной корреляции:

@tf.function
def make_xcorr_err1(T, S, sigma_S):
    sum_spectra_sq = tf.reduce_sum(tf.square(S), 1) #shape (batch,)
    sum_template_sq = tf.reduce_sum(tf.square(T), 0) #shape (Nz, )
    norm = tf.sqrt(tf.reshape(sum_spectra_sq, (-1,1))*tf.reshape(sum_template_sq, (1,-1))) #shape (batch, Nz)
    xcorr = tf.matmul(S, T, transpose_a = False, transpose_b= False)/norm

    foo1 = tf.matmul(sigma_S**2, T**2, transpose_a = False, transpose_b= False)/norm**2
    foo2 = xcorr**2 * tf.reshape(sum_template_sq**2, (1,-1)) * tf.reshape(tf.reduce_sum((S*sigma_S)**2, 1), (-1,1))/norm**4
    foo3 = - 2 * xcorr * tf.reshape(sum_template_sq, (1,-1)) * tf.matmul(S*(sigma_S)**2, T, transpose_a = False, transpose_b= False)/norm**3

    sigma_xcorr = tf.sqrt(tf.maximum(foo1+foo2+foo3, 0.))

Возможно, чтобы понять мою проблему, важнее, чем код, изображение, представляющее вывод. Это функция взаимной корреляции для одного пикселя, красным цветом обозначено максимальное значение, назовем z_best, т.е. наилучшее значение взаимной корреляции. На рисунке также показаны 3 сигма-ошибки (серые пределы + 3 сигма -3 сигма).

xcorr-function

Если я приближаюсь к пику, я получите это:

xcorr-function zoom

Как вы можете видеть, максимум (как и любое другое значение) колеблется в пределах определенного диапазона. Я хотел бы найти способ сопоставить эти колебания максимума (или колебания вокруг максимума, или колебания всей функции) с ошибкой на значении, соответствующем максимуму, то есть с ошибкой z_best.

...