Слегка изменено из: Python Pandas Dataframe: нормализовать данные между 0,01 и 0,99? но из некоторых комментариев подумал, что это актуально (извините, если это считается репостом ...)
Я хотел, чтобы индивидуальная нормализация в этом обычном процентиле данных или z-балла была недостаточной. Иногда я знал, каковы возможные максимумы и минимумы популяции, и поэтому хотел определить их, отличные от моей выборки, или другую среднюю точку, или что-то еще! Это часто может быть полезно для изменения масштаба и нормализации данных для нейронных сетей, где вы можете захотеть, чтобы все входные данные находились в диапазоне от 0 до 1, но некоторые из ваших данных, возможно, потребуется масштабировать более индивидуально ... потому что процентили и стандартные отклонения предполагают, что ваши образцы покрывают населения, но иногда мы знаем, что это неправда. Это также было очень полезно для меня при визуализации данных на тепловых картах. Итак, я создал собственную функцию (использовал дополнительные шаги в коде здесь, чтобы сделать его максимально читаемым):
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: Single 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
.