Вопрос:

Мин-макс нормализация массива NumPy

python arrays numpy

8664 просмотра

4 ответа

644 Репутация автора

У меня есть следующий массив NumPy:

foo = np.array([[0.0, 10.0], [0.13216, 12.11837], [0.25379, 42.05027], [0.30874, 13.11784]])

который дает:

[[  0.       10.     ]
 [  0.13216  12.11837]
 [  0.25379  42.05027]
 [  0.30874  13.11784]]

Как я могу нормализовать компонент Y этого массива. Так что это дает мне что-то вроде:

[[  0.       0.   ]
 [  0.13216  0.06 ]
 [  0.25379  1    ]
 [  0.30874  0.097]]
Автор: mbilyanov Источник Размещён: 10.01.2018 01:02

Ответы (4)


2 плюса

15253 Репутация автора

Я думаю, что вы хотите это:

foo[:,1] = (foo[:,1] - foo[:,1].min()) / (foo[:,1].max() - foo[:,1].min())
Автор: James Размещён: 10.01.2018 01:14

5 плюса

158925 Репутация автора

Решение

Обращаясь к этой перекрестной проверенной ссылке, Как нормализовать данные в диапазоне 0-1? Похоже, вы можете выполнить нормализацию min-max в последнем столбце foo.

v = foo[:, 1]   # foo[:, -1] for the last column
foo[:, 1] = (v - v.min()) / (v.max() - v.min())

foo

array([[ 0.        ,  0.        ],
       [ 0.13216   ,  0.06609523],
       [ 0.25379   ,  1.        ],
       [ 0.30874   ,  0.09727968]])

Другой вариант выполнения нормализации (как предложено OP) - использование sklearn.preprocessing.normalize, которое дает немного другие результаты -

from sklearn.preprocessing import normalize
foo[:, [-1]] = normalize(foo[:, -1, None], norm='max', axis=0)

foo

array([[ 0.        ,  0.2378106 ],
       [ 0.13216   ,  0.28818769],
       [ 0.25379   ,  1.        ],
       [ 0.30874   ,  0.31195614]])
Автор: cs95 Размещён: 10.01.2018 01:14

1 плюс

12897 Репутация автора

sklearn.preprocessing.MinMaxScaler также может быть использован ( feature_range=(0, 1)по умолчанию):

from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
v = foo[:,1]
v_scaled = min_max_scaler.fit_transform(v)
foo[:,1] = v_scaled
print(foo)

Выход:

[[ 0.          0.        ]
 [ 0.13216     0.06609523]
 [ 0.25379     1.        ]
 [ 0.30874     0.09727968]]

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

Автор: rnso Размещён: 10.01.2018 01:58

1 плюс

979 Репутация автора

Вы пытаетесь мин-макс шкалу от 0 до 1 только во втором столбце.

Использование sklearn.preprocessing.minmax_scale, должно легко решить вашу проблему.

например:

from sklearn.preprocessing import minmax_scale

column_1 = foo[:,0] #first column you don't want to scale
column_2 = minmax_scale(foo[:,1], feature_range=(0,1)) #second column you want to scale
foo_norm = np.stack((column_1, column_2), axis=1) #stack both columns to get a 2d array

Должен уступить

array([[0.        , 0.        ],
       [0.13216   , 0.06609523],
       [0.25379   , 1.        ],
       [0.30874   , 0.09727968]])

Может быть, вы хотите, чтобы min-max масштабировался между 0 и 1 в обоих столбцах. В этом случае используйте:

foo_norm = minmax_scale(foo, feature_range=(0,1), axis=0)

Который дает

array([[0.        , 0.        ],
       [0.42806245, 0.06609523],
       [0.82201853, 1.        ],
       [1.        , 0.09727968]])

примечание : не путать с операцией, которая масштабирует норму (длину) вектора до определенного значения (обычно 1), которое также обычно называют нормализацией.

Автор: yellow01 Размещён: 05.04.2019 12:58
Вопросы из категории :
32x32