Вопрос или проблема
Я беру абсолютные значения всех элементов, вычисляю среднее, вычитаю его из исходных значений. Мне кажется, что это неверно и может изменить векторы. Я также делю на стандартное отклонение, но я довольно уверен в этом, зная, что это чистое масштабирование комплексных значений.
Есть ли какие-либо рекомендации, как это сделать?
PS: Моя беспокойство возникает от мысли о каждом элементе с комплексным значением как о векторе на плоскости, и это вычитание может изменить его направление.
Во-первых, всегда полезно думать геометрически о том, что такое комплексные числа и что достигают арифметические операции.
В вашей функции вы используете среднее и стандартное отклонение абсолютной величины этих комплексных чисел. Это означает, что если вы выполните вашу операцию с абсолютной величиной ваших данных:
(tmp - tmp.mean()) / tmp.std()
вы получите нормализованные данные со средним 0 и стандартным отклонением 1.
Возвращаясь к геометрическому мышлению, когда вы выполняете вашу исходную операцию:
(x_source - tmp.mean()) / tmp.std()
вы по сути смещаете среднее ваших данных на tmp.mean()
единиц влево, затем масштабируете горизонтально на 1/tmp.std()
.
Обратите внимание, что нет вертикального сдвига или масштабирования, поэтому что-то кажется странным.
Что бы я сделал: я бы нормализовал каждую координату независимо.
Нахождение среднего в порядке — среднее комплексных точек данных такое же, как и средние значений компонентов:
$$
\bar z = (\bar x, \bar y)
$$
Так что вы можете вычесть среднее значение $x$ из каждой координаты $x$ входной величины. То же самое для $y$.
Затем вы делите реальную компоненту на стандартное отклонение реальной компоненты, и то же самое для мнимой компоненты.
Также может быть уместно разделить на стандартное отклонение (новых) норм. Это обеспечило бы хорошие свойства, связанные с вашими данными, лежащими внутри круга определенного радиуса.
Код:
real_data = real(x_source)
imag_data = imaginary(x_source)
real_data = ( real_data - real_data.mean() ) / real_data.std()
imag_data = ( imag_data - imag_data.mean() ) / imag_data.std()
x_source_norm = real_data + i * imag_data
Это старый вопрос, но я хотел бы задокументировать конкретный случай для будущей справки.
Если ваши данные следуют комплексному нормальному распределению $X \sim \mathcal{CN}(\mu, \sigma^2)$, то реальные $(X_{\mathbb{R}})$ и мнимые $(X_{\mathbb{I}})$ части данных независимо распределены по Гауссу. В частности,
$$
X_\mathbb{R} \sim \mathcal{N}\left(\mu_\mathbb{R}, \frac{\sigma^2}{2}\right), \quad X_\mathbb{I} \sim \mathcal{N}\left(\mu_\mathbb{I}, \frac{\sigma^2}{2}\right).
$$
Это позволяет нам оценить средние значения реальных и мнимых частей отдельно и вычислить дисперсию (или стандартное отклонение) с использованием обоих компонентов.
Процесс нормализации:
real_data = real(x_source)
imag_data = imaginary(x_source)
real_data = (2**0.5) * (real_data - real_data.mean()) / x_source.std()
imag_data = (2**0.5) * (imag_data - imag_data.mean()) / x_source.std()
x_source_norm = real_data + 1j * imag_data
Numpy может рассчитывать стандартное отклонение комплексных чисел.
Ответ или решение
Как нормализовать данные с комплексными числами?
Теория
Работа с комплексными числами требует понимания их геометрической интерпретации. Комплексное число можно представить как точку на двумерной плоскости, где ось (x) соответствует действительной части, а ось (y) — мнимой. Нормализация комплексных чисел включает в себя приведение данных к стандартному виду с нулевым средним и единичным стандартным отклонением, что позволяет упростить работу с ними и улучшить устойчивость моделей машинного обучения.
При нормализации комплексных данных необходимо учитывать как реальную, так и мнимую часть каждого числа. Нормализация абсолютных значений, т.е. модулей, применяется редко и может повлиять на направление вектора, что приведет к искажению данных.
Пример
Рассмотрим данные, распределенные по комплексному гауссовскому распределению (\mathcal{CN}(\mu, \sigma^2)). В этом случае реальная и мнимая части данных будут иметь независимые нормальные распределения. Среднее и стандартное отклонение для обеих частей можно вычислить отдельно.
Пример кода для реализации нормализации:
import numpy as np
# Исходные комплексные данные
x_source = np.array([1+2j, 3+4j, 5+6j])
# Выделение действительной и мнимой частей
real_data = np.real(x_source)
imag_data = np.imag(x_source)
# Нормализация действительной и мнимой частей
real_data = (real_data - np.mean(real_data)) / np.std(real_data)
imag_data = (imag_data - np.mean(imag_data)) / np.std(imag_data)
# Объединение частей
x_source_norm = real_data + 1j * imag_data
Применение
Применяя этот метод нормализации на практике, мы обеспечиваем, что каждая координата (действительная и мнимая) рассматривается равноправно и изменения в данных сохраняют их относительное положение на комплексной плоскости. Это особенно важно в задачах, например, в обработке сигналов или при анализе временных рядов в электросвязи, где форма и фаза сигнала играют ключевую роль.
Понимание и корректное применение нормализации комплексных чисел являются критически важными для получения достоверных и устойчивых результатов анализа данных.