Трохи модифікований від: Пам’ять даних Python Pandas: нормалізувати дані між 0,01 і 0,99? але з деяких коментарів він вважав це доречним (вибачте, якщо вважають репостом, хоча ...)
Я хотів налаштувати нормалізацію в тому, що регулярний перцентиль дати або z-балу не був адекватним. Іноді я знав, що таке можливі максимум і хв для населення, і тому хотів визначити це, крім мого зразка, чи іншого середини, чи будь-чого іншого! Це часто може бути корисним для масштабування та нормалізації даних для нейронних мереж, де ви хочете, щоб усі входи були від 0 до 1, але деякі ваші дані, можливо, потрібно буде масштабувати більш налаштованим способом ... тому, що процентилі та stdevs передбачають обкладинку вашої вибірки населення, але іноді ми знаємо, що це неправда. Це також було дуже корисно для мене під час візуалізації даних у теплових картах. Тому я побудував власну функцію (тут використовуються додаткові кроки в коді, щоб зробити її максимально зрозумілою):
def NormData(s,low='min',center='mid',hi='max',insideout=False,shrinkfactor=0.):
if low=='min':
low=min(s)
elif low=='abs':
low=max(abs(min(s)),abs(max(s)))*-1.#sign(min(s))
if hi=='max':
hi=max(s)
elif hi=='abs':
hi=max(abs(min(s)),abs(max(s)))*1.#sign(max(s))
if center=='mid':
center=(max(s)+min(s))/2
elif center=='avg':
center=mean(s)
elif center=='median':
center=median(s)
s2=[x-center for x in s]
hi=hi-center
low=low-center
center=0.
r=[]
for x in s2:
if x<low:
r.append(0.)
elif x>hi:
r.append(1.)
else:
if x>=center:
r.append((x-center)/(hi-center)*0.5+0.5)
else:
r.append((x-low)/(center-low)*0.5+0.)
if insideout==True:
ir=[(1.-abs(z-0.5)*2.) for z in r]
r=ir
rr =[x-(x-0.5)*shrinkfactor for x in r]
return rr
Це займе серію панд, або навіть просто список і нормалізує його до вказаних низьких, центральних та високих точок. також є фактор скорочення! щоб дозволити масштабування даних подалі від кінцевих точок 0 і 1 (мені довелося це робити, комбінуючи кольорові карти в matplotlib: Один pcolormesh з більш ніж однією кольоровою картою за допомогою Matplotlib ) Тож ви, ймовірно, можете побачити, як працює код, але в основному ви кажете, що ви мають значення [-5,1,10] у вибірці, але хочуть нормалізуватися виходячи з діапазону від -7 до 7 (тому все, що перевищує 7, наше "10" трактується як 7 ефективно) із серединою 2, але зменшіть його до розміру кольорової карти 256 RGB:
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
Він також може перетворити ваші дані зсередини ... Це може здатися дивним, але я вважаю це корисним для теплової карти. Скажіть, що вам потрібно темніший колір для значень, ближчих до 0, а не привіт / низький. Ви можете нагрівати карту на основі нормалізованих даних, де insideout = True:
#In[2]
NormData([-5,2,10],low=-7,center=1,hi=7,insideout=True,shrinkfactor=2./256)
#Out[2]
[0.251953125, 0.8307291666666666, 0.00390625]
Тож зараз "2", який знаходиться найближче до центру, визначений як "1", є найвищим значенням.
У будь-якому разі, я вважав, що моя заява є доречною, якщо ви хочете змінити масштаб даних іншими способами, які можуть мати для вас корисні програми.
A
іB
є частиною більшого фактора групування, який ви хочете нормалізувати окремо відC
таD
.