Sửa đổi một chút từ: Python Pandas Dataframe: Bình thường hóa dữ liệu trong khoảng từ 0,01 đến 0,99?nhưng từ một số ý kiến cho rằng nó có liên quan (xin lỗi nếu được coi là repost mặc dù ...)
Tôi muốn chuẩn hóa tùy chỉnh trong phần trăm thông thường của điểm chuẩn hoặc điểm z là không đủ. Đôi khi tôi biết tối đa và tối thiểu khả thi của dân số là gì, và do đó muốn xác định nó khác với mẫu của tôi, hoặc một điểm giữa khác, hoặc bất cứ điều gì! Điều này thường có thể hữu ích cho việc định cỡ lại và chuẩn hóa dữ liệu cho các mạng lưới thần kinh nơi bạn có thể muốn tất cả các đầu vào trong khoảng từ 0 đến 1, nhưng một số dữ liệu của bạn có thể cần được thu nhỏ theo cách tùy chỉnh hơn ... bởi vì phần trăm và stdevs giả định bìa của bạn dân số, nhưng đôi khi chúng ta biết điều này không đúng. Nó cũng rất hữu ích cho tôi khi trực quan hóa dữ liệu trong các bản đồ nhiệt. Vì vậy, tôi đã xây dựng một chức năng tùy chỉnh (sử dụng các bước bổ sung trong mã ở đây để làm cho nó dễ đọc nhất có thể):
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
Điều này sẽ đưa vào một loạt gấu trúc, hoặc thậm chí chỉ là một danh sách và bình thường hóa nó đến các điểm thấp, trung tâm và điểm cao được chỉ định của bạn. cũng có một yếu tố thu nhỏ! để cho phép bạn thu nhỏ dữ liệu khỏi các điểm cuối 0 và 1 (Tôi đã phải làm điều này khi kết hợp các bản đồ màu trong matplotlib: pcolormesh đơn với nhiều hơn một bản đồ màu bằng Matplotlib ) Vì vậy, bạn có thể thấy cách mã hoạt động có các giá trị [-5,1,10] trong một mẫu, nhưng muốn bình thường hóa dựa trên phạm vi từ -7 đến 7 (vì vậy, bất cứ điều gì trên 7, "10" của chúng tôi được coi là 7 một cách hiệu quả) với trung điểm là 2, nhưng thu nhỏ nó để phù hợp với một bản đồ màu 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]
Nó cũng có thể biến dữ liệu của bạn từ trong ra ngoài ... điều này có vẻ kỳ lạ, nhưng tôi thấy nó hữu ích cho việc lập bản đồ nhiệt. Giả sử bạn muốn màu tối hơn cho các giá trị gần bằng 0 hơn là hi / low. Bạn có thể lập bản đồ nhiệt dựa trên dữ liệu đã chuẩn hóa trong khioutout = 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]
Vì vậy, bây giờ "2" gần trung tâm nhất, được định nghĩa là "1" là giá trị cao nhất.
Dù sao, tôi nghĩ rằng ứng dụng của tôi có liên quan nếu bạn đang tìm cách hủy dữ liệu theo những cách khác có thể có các ứng dụng hữu ích cho bạn.
A
vàB
là một phần của một yếu tố nhóm lớn hơn mà bạn muốn bình thường hóa riêng biệt từC
vàD
.