Это моя проблема:
Первый вход - это данные наблюдений 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, я пытаюсь добавить код и цифры, чтобы лучше понять проблему. Но перед этим, может быть, лучше немного математики.
С этим выражением я вычислил взаимную корреляцию:
где S
- спектры, T
- шаблон, а N
- коэффициент нормализации. Так как S
имеет ошибку, я распространял эти ошибки через основание предыдущего отношения:
, где 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 сигма).
Если я приближаюсь к пику, я получите это:
Как вы можете видеть, максимум (как и любое другое значение) колеблется в пределах определенного диапазона. Я хотел бы найти способ сопоставить эти колебания максимума (или колебания вокруг максимума, или колебания всей функции) с ошибкой на значении, соответствующем максимуму, то есть с ошибкой z_best
.