Leggermente modificato da: Python Pandas Dataframe: normalizzare i dati tra 0,01 e 0,99? ma da alcuni dei commenti ha ritenuto che fosse pertinente (scusate se considerato un repost però ...)
Volevo che la normalizzazione personalizzata in quel normale percentile di dato o punteggio z non fosse adeguata. A volte sapevo quali fossero i massimi e i minimi possibili della popolazione e quindi volevo definirlo diverso dal mio campione, da un punto medio diverso o da qualunque altra cosa! Questo può spesso essere utile per riscalare e normalizzare i dati per le reti neurali in cui potresti desiderare tutti gli input tra 0 e 1, ma potrebbe essere necessario ridimensionare alcuni dei tuoi dati in un modo più personalizzato ... perché percentili e stdev presuppongono che le copertine dei tuoi campioni la popolazione, ma a volte sappiamo che questo non è vero. È stato anche molto utile per me durante la visualizzazione dei dati nelle mappe di calore. Quindi ho creato una funzione personalizzata (ho usato passaggi aggiuntivi nel codice qui per renderlo il più leggibile possibile):
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
Questo prenderà una serie di panda, o anche solo un elenco e lo normalizzerà ai punti bassi, centrali e alti specificati. inoltre c'è un fattore di restringimento! per permetterti di ridimensionare i dati lontano dagli endpoint 0 e 1 (ho dovuto farlo quando ho combinato i colormap in matplotlib: Single pcolormesh con più di un colormap usando Matplotlib ) Quindi puoi probabilmente vedere come funziona il codice, ma fondamentalmente dire che hanno valori [-5,1,10] in un campione, ma vogliono normalizzarsi in base a un intervallo da -7 a 7 (quindi qualsiasi cosa al di sopra di 7, il nostro "10" viene trattato come un 7 in modo efficace) con un punto medio di 2, ma riducilo per adattarlo a una mappa colori 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]
Può anche capovolgere i tuoi dati ... questo può sembrare strano, ma l'ho trovato utile per la produzione di calore. Supponi di voler un colore più scuro per valori più vicini a 0 anziché hi / low. È possibile creare una mappa di calore basata su dati normalizzati dove 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]
Quindi ora "2" che è il più vicino al centro, definito come "1" è il valore più alto.
Comunque, ho pensato che la mia applicazione fosse pertinente se stai cercando di ridimensionare i dati in altri modi che potrebbero avere applicazioni utili per te.
A
eB
fa parte di un fattore di raggruppamento più grande che desideri normalizzare separatamente daC
eD
.