Şuradan biraz değiştirildi: Python Pandas Dataframe: 0.01 ile 0.99 arasında veriler normalleştirilsin mi?ancak bazı yorumlardan konuyla ilgili olduğunu düşündü (yine de bir yeniden yayın olarak kabul edilirse özür dilerim ...)
Verinin düzenli yüzdelik diliminde özelleştirilmiş normalleştirme istedim veya z-skoru yeterli değildi. Bazen popülasyonun uygulanabilir maksimum ve minimumunun ne olduğunu biliyordum ve bu nedenle onu örneklem dışında veya farklı bir orta nokta veya her neyse dışında tanımlamak istedim! Bu genellikle 0 ile 1 arasında tüm girdileri isteyebileceğiniz sinir ağları için verileri yeniden ölçeklendirmek ve normalleştirmek için yararlı olabilir, ancak verilerinizin bir kısmının daha özelleştirilmiş bir şekilde ölçeklenmesi gerekebilir ... nüfus, ama bazen bunun doğru olmadığını biliyoruz. Isı haritalarında verileri görselleştirirken de benim için çok faydalı oldu. Bu yüzden özel bir işlev oluşturdum (mümkün olduğunca okunabilir hale getirmek için buradaki kodda ekstra adımlar kullandım):
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
Bu, bir pandalar dizisini veya hatta sadece bir listeyi alacak ve belirttiğiniz alt, orta ve yüksek noktalara göre normalleştirecektir. ayrıca bir küçültme faktörü var! verileri 0 ve 1 uç noktalarından uzak bir yere ölçeklendirmenize izin vermek için (bunu matplotlib'de renk haritalarını birleştirirken yapmak zorunda kaldım: Matplotlib kullanarak birden fazla renk haritasıyla tek pcolormesh ) Bu nedenle, kodun nasıl çalıştığını muhtemelen görebilirsiniz, ancak temelde bir örnekte [-5,1,10] değerlerine sahiptir, ancak -7 ila 7 aralığına göre normalize etmek istiyorsanız (yani 7'nin üzerindeki herhangi bir şey, "10 "'umuz etkili bir şekilde 7 olarak kabul edilir) 2 orta noktası ile, ancak 256 RGB renk haritasına sığacak şekilde küçültün:
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
Ayrıca verilerinizi tersyüz edebilir ... bu tuhaf görünebilir, ancak ısı haritalama için yararlı buldum. Yüksek / düşük yerine 0'a yakın değerler için daha koyu bir renk istediğinizi varsayalım. İçeride = Doğru olduğunda normalleştirilmiş verilere dayalı olarak ısı haritası yapabilirsiniz:
#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]
Şimdi merkeze en yakın olan "2", "1" olarak tanımlanan en yüksek değerdir.
Her neyse, sizin için yararlı uygulamalar olabilecek başka şekillerde verileri yeniden ölçeklendirmek istiyorsanız başvurumun alakalı olduğunu düşündüm.
A
veB
size ayrı normalleştirmek istediklerini daha büyük bir gruplaşma faktörünün parçasıdırC
veD
.