แก้ไขเล็กน้อยจาก: Python Pandas Dataframe: Normalize data ระหว่าง 0.01 ถึง 0.99? แต่จากความคิดเห็นบางส่วนคิดว่าเกี่ยวข้อง (ขออภัยหากถือว่าเป็นการรีโพสต์แม้ว่า ... )
ฉันต้องการปรับให้เป็นมาตรฐานที่กำหนดเองในเปอร์เซ็นไทล์ปกติของ datum หรือ z-score นั้นไม่เพียงพอ บางครั้งฉันรู้ว่าจำนวนสูงสุดและต่ำสุดที่เป็นไปได้ของประชากรคืออะไรดังนั้นจึงต้องการกำหนดค่านี้นอกเหนือจากกลุ่มตัวอย่างของฉันหรือจุดกึ่งกลางอื่นหรืออะไรก็ตาม! สิ่งนี้มักมีประโยชน์ในการปรับขนาดและปรับขนาดข้อมูลให้เป็นมาตรฐานสำหรับอวนประสาทซึ่งคุณอาจต้องการอินพุตทั้งหมดระหว่าง 0 ถึง 1 แต่ข้อมูลบางส่วนของคุณอาจต้องปรับขนาดด้วยวิธีที่กำหนดเองมากขึ้น ... เนื่องจากเปอร์เซ็นไทล์และ stdev ถือว่าตัวอย่างของคุณครอบคลุม ประชากร แต่บางครั้งเรารู้ว่าสิ่งนี้ไม่เป็นความจริง นอกจากนี้ยังมีประโยชน์มากสำหรับฉันเมื่อแสดงภาพข้อมูลในแผนที่ความร้อน ดังนั้นฉันจึงสร้างฟังก์ชันที่กำหนดเอง (ใช้ขั้นตอนพิเศษในโค้ดที่นี่เพื่อให้อ่านได้ง่ายที่สุด):
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
สิ่งนี้จะใช้ในซีรีส์แพนด้าหรือแม้แต่รายการและปรับให้เป็นจุดต่ำกลางและสูงที่คุณระบุ นอกจากนี้ยังมีปัจจัยหดตัว! เพื่อให้คุณสามารถย่อขนาดข้อมูลให้ห่างจากจุดสิ้นสุด 0 และ 1 (ฉันต้องทำสิ่งนี้เมื่อรวม colormaps ใน matplotlib: Single pcolormesh ที่มี colormap มากกว่าหนึ่ง colormap โดยใช้ Matplotlib ) ดังนั้นคุณจึงสามารถเห็นว่าโค้ดทำงานอย่างไร แต่โดยทั่วไปแล้วคุณจะพูดว่า มีค่า [-5,1,10] ในตัวอย่าง แต่ต้องการทำให้เป็นมาตรฐานตามช่วง -7 ถึง 7 (ดังนั้นอะไรก็ตามที่สูงกว่า 7 "10" ของเราจะถือว่าเป็น 7 อย่างมีประสิทธิภาพ) โดยมีจุดกึ่งกลาง 2 แต่ย่อขนาดให้พอดีกับ colormap 256 RGB:
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
[0.1279296875, 0.5826822916666667, 0.99609375]
นอกจากนี้ยังสามารถเปลี่ยนข้อมูลของคุณจากภายใน ... สิ่งนี้อาจดูแปลก แต่ฉันพบว่ามีประโยชน์สำหรับการทำแผนที่ความร้อน สมมติว่าคุณต้องการสีเข้มขึ้นสำหรับค่าที่ใกล้เคียงกับ 0 แทนที่จะเป็น hi / low คุณสามารถแผนที่ความร้อนตามข้อมูลที่ทำให้เป็นมาตรฐานโดยที่ insideout = True:
NormData([-5,2,10],low=-7,center=1,hi=7,insideout=True,shrinkfactor=2./256)
[0.251953125, 0.8307291666666666, 0.00390625]
ตอนนี้ "2" ซึ่งอยู่ใกล้จุดศูนย์กลางมากที่สุดโดยกำหนดให้ "1" เป็นค่าสูงสุด
อย่างไรก็ตามฉันคิดว่าแอปพลิเคชันของฉันมีความเกี่ยวข้องหากคุณต้องการลดขนาดข้อมูลด้วยวิธีอื่นที่อาจมีแอปพลิเคชันที่มีประโยชน์กับคุณ
A
และB
เป็นส่วนหนึ่งของปัจจัยการจัดกลุ่มขนาดใหญ่ที่คุณต้องการที่จะแยกต่างหากจากปกติและC
D