Leicht modifiziert von: Python Pandas Dataframe: Daten zwischen 0,01 und 0,99 normalisieren? aber aus einigen Kommentaren ging hervor, dass dies relevant war (sorry, wenn dies als Repost angesehen wird ...)
Ich wollte eine angepasste Normalisierung, da das reguläre Perzentil des Bezugspunkts oder des Z-Scores nicht ausreicht. Manchmal wusste ich, was die realisierbaren Max- und Min-Werte der Bevölkerung waren, und wollte sie daher anders als meine Stichprobe oder einen anderen Mittelpunkt oder was auch immer definieren! Dies kann häufig nützlich sein, um Daten für neuronale Netze neu zu skalieren und zu normalisieren, wobei Sie möglicherweise alle Eingaben zwischen 0 und 1 wünschen, einige Ihrer Daten jedoch möglicherweise individueller skaliert werden müssen ... da Perzentile und Standardwerte Ihre Stichprobenabdeckungen voraussetzen die Bevölkerung, aber manchmal wissen wir, dass dies nicht wahr ist. Es war auch sehr nützlich für mich bei der Visualisierung von Daten in Heatmaps. Also habe ich eine benutzerdefinierte Funktion erstellt (zusätzliche Schritte im Code hier verwendet, um ihn so lesbar wie möglich zu machen):
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
Dadurch wird eine Pandas-Serie oder auch nur eine Liste aufgenommen und auf die angegebenen Tief-, Mittel- und Hochpunkte normalisiert. es gibt auch einen schrumpfungsfaktor! Damit Sie die Daten von den Endpunkten 0 und 1 weg verkleinern können (ich musste dies tun, wenn ich Farbkarten in Matplotlib kombinierte: Einzelne Farbkarten mit mehr als einer Farbkarte mit Matplotlib ). Sie können also wahrscheinlich sehen, wie der Code funktioniert, aber im Grunde sagen Sie es haben Werte [-5,1,10] in einer Stichprobe, möchten aber basierend auf einem Bereich von -7 bis 7 (also alles über 7, unsere "10" wird effektiv als 7 behandelt) mit einem Mittelpunkt von 2 normalisieren. Verkleinern Sie es jedoch auf eine 256-RGB-Farbkarte:
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
Es kann auch Ihre Daten auf den Kopf stellen ... das mag seltsam erscheinen, aber ich fand es nützlich für Heatmapping. Angenommen, Sie möchten eine dunklere Farbe für Werte, die näher an 0 als hoch / niedrig liegen. Sie können eine Heatmap basierend auf normalisierten Daten erstellen, wobei 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]
Jetzt ist "2", die dem Zentrum am nächsten liegt und als "1" definiert ist, der höchste Wert.
Wie auch immer, ich dachte, meine Anwendung wäre relevant, wenn Sie Daten auf andere Weise neu skalieren möchten, die nützliche Anwendungen für Sie haben könnten.
A
undB
sind Teil eines größeren Gruppierungsfaktors, den Sie getrennt vonC
und normalisieren möchtenD
.