Нормализация сложных значений в NumPy/Python

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

def split_real_img(x):
    real_array = x.real
    img_array = x.imag
    return real_array, img_array

А затем нормализовать каждый отдельно с помощью

def numpy_minmax(X):
    xmin =  X.min()
    print X.min()
    print X.max()
    return (2*(X - xmin) / (X.max() - xmin)-1)*0.9

после нормализации оба набора данных должны быть объединены, чтобы они возвращались в один набор данных со сложными значениями?, но как мне это сделать?

Нормализация данных выполнена, так что я могу использовать tanh в качестве функции активации, которая работает в диапазонах от -0,9 до 0,9 =>, поэтому мне нужно нормализовать набор данных в этих диапазонах.


person I am not Fat    schedule 10.01.2017    source источник
comment
Вы можете создать сложный массив, суммируя два компонента (с множителем 1j): np.allclose(x.real + 1j*x.imag, x). Или вы можете выразить это как скалярный продукт np.dot([1,1j],[x.real,x.imag]).   -  person hpaulj    schedule 11.01.2017


Ответы (1)


В основном, будут задействованы два шага:

  • Сместите все числа на минимум по действительной и мнимой осям.

  • Разделите каждое значение на максимальное. величина. Чтобы получить величину комплексного числа, просто используйте np.abs().

Таким образом, реализация будет -

def normalize_complex_arr(a):
    a_oo = a - a.real.min() - 1j*a.imag.min() # origin offsetted
    return a_oo/np.abs(a_oo).max()

Примеры выполнения для проверки

Начнем с массива, в котором минимум один из [0+0j] и еще два элемента — [x1+y1*J] и [y1+x1*J]. Таким образом, их величины после нормализации должны быть 1 каждая.

In [358]: a = np.array([0+0j, 1+17j, 17+1j])

In [359]: normalize_complex_arr(a)
Out[359]: 
array([ 0.00000000+0.j        ,  0.05872202+0.99827437j,
        0.99827437+0.05872202j])

In [360]: np.abs(normalize_complex_arr(a))
Out[360]: array([ 0.,  1.,  1.])

Далее давайте добавим смещение к минимальному элементу. Это не должно изменять их величины после нормализации -

In [361]: a = np.array([0+0j, 1+17j, 17+1j]) + np.array([2+3j])

In [362]: a
Out[362]: array([  2. +3.j,   3.+20.j,  19. +4.j])

In [363]: normalize_complex_arr(a)
Out[363]: 
array([ 0.00000000+0.j        ,  0.05872202+0.99827437j,
        0.99827437+0.05872202j])

In [364]: np.abs(normalize_complex_arr(a))
Out[364]: array([ 0.,  1.,  1.])

Наконец, давайте добавим еще один элемент, который находится в два раза дальше от смещенного источника, чтобы убедиться, что этот новый элемент имеет величину 1, а другие уменьшаются до 0.5 -

In [365]: a = np.array([0+0j, 1+17j, 17+1j, 34+2j]) + np.array([2+3j])

In [366]: a
Out[366]: array([  2. +3.j,   3.+20.j,  19. +4.j,  36. +5.j])

In [367]: normalize_complex_arr(a)
Out[367]: 
array([ 0.00000000+0.j        ,  0.02936101+0.49913719j,
        0.49913719+0.02936101j,  0.99827437+0.05872202j])

In [368]: np.abs(normalize_complex_arr(a))
Out[368]: array([ 0. ,  0.5,  0.5,  1. ])
person Divakar    schedule 10.01.2017
comment
@IamnotFat Normalize обычно означает 0 to 1.0. Пожалуйста, добавьте детали в вопрос, что вы хотите диапазон от 0.9 to -0.9. - person Divakar; 11.01.2017