Nieznacznie zmodyfikowane z: Python Pandas Dataframe: Normalizacja danych między 0,01 a 0,99? ale z niektórych komentarzy wynika, że jest to istotne (przepraszam, jeśli uważane za ponowne przesłanie ...)
Chciałem, aby dostosowana normalizacja w tym regularnym percentylu danych lub z-score nie była odpowiednia. Czasami wiedziałem, jakie są możliwe maksymalne i minimalne wartości populacji, i dlatego chciałem zdefiniować ją inaczej niż moja próbka, inny punkt środkowy lub cokolwiek! Może to być często przydatne do przeskalowania i normalizowania danych dla sieci neuronowych, w których możesz potrzebować wszystkich danych wejściowych od 0 do 1, ale niektóre dane mogą wymagać skalowania w bardziej dostosowany sposób ... ponieważ percentyle i standardowe wartości zakładają pokrycie próbek populacji, ale czasami wiemy, że to nieprawda. Było to również dla mnie bardzo przydatne podczas wizualizacji danych w heatmapach. Zbudowałem więc funkcję niestandardową (użyłem dodatkowych kroków w kodzie tutaj, aby uczynić ją jak najbardziej czytelną):
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.
if hi=='max':
hi=max(s)
elif hi=='abs':
hi=max(abs(min(s)),abs(max(s)))*1.
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
To zajmie serię pand, a nawet tylko listę i znormalizuje ją do określonych niskich, środkowych i wysokich punktów. istnieje również współczynnik kurczenia się! aby umożliwić Ci skalowanie danych z dala od punktów końcowych 0 i 1 (musiałem to zrobić łącząc mapy kolorów w matplotlib: Pojedynczy pcolormesh z więcej niż jedną mapą kolorów używającą Matplotlib ) Więc prawdopodobnie zobaczysz jak działa kod, ale zasadniczo mówię, że mają wartości [-5,1,10] w próbie, ale chcą znormalizować w oparciu o zakres od -7 do 7 (więc wszystko powyżej 7, nasze „10” jest traktowane jako 7) z punktem środkowym równym 2, ale zmniejsz ją, aby pasowała do mapy kolorów 256 RGB:
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
[0.1279296875, 0.5826822916666667, 0.99609375]
Może również wywrócić dane na drugą stronę ... może się to wydawać dziwne, ale uznałem to za przydatne do mapowania ciepła. Powiedzmy, że chcesz mieć ciemniejszy kolor dla wartości bliższych 0, a nie hi / low. Możesz utworzyć mapę cieplną w oparciu o znormalizowane dane, gdzie insideout = True:
NormData([-5,2,10],low=-7,center=1,hi=7,insideout=True,shrinkfactor=2./256)
[0.251953125, 0.8307291666666666, 0.00390625]
Zatem teraz „2”, które jest najbliżej środka, zdefiniowane jako „1”, jest wartością najwyższą.
W każdym razie pomyślałem, że moja aplikacja jest odpowiednia, jeśli chcesz przeskalować dane w inny sposób, który może mieć przydatne aplikacje.
AiBwejdź w skład większego czynnika grupowania, który chcesz normalizować oddzielnie odCiD.