Hướng dẫn normalize a list python - bình thường hóa một danh sách python

Tôi muốn có định mức của một mảng NumPy. Cụ thể hơn, tôi đang tìm kiếm một phiên bản tương đương của chức năng này

Show
def normalize(v): norm = np.linalg.norm(v) if norm == 0: return v return v / norm

Có điều gì đó tương tự như vậy trong skearn hoặc numpy không?

Hàm này hoạt động trong tình huống trong đó v là vectơ 0.

Nếu bạn đang sử dụng scikit-learn, bạn có thể sử dụng sklearn.preprocessing.normalize :

import numpy as np from sklearn.preprocessing import normalize x = np.random.Rand(1000)*10 norm1 = x / np.linalg.norm(x) norm2 = normalize(x[:,np.newaxis], axis=0).ravel() print np.all(norm1 == norm2) # True

Tôi đồng ý rằng thật tuyệt nếu chức năng như vậy là một phần của pin đi kèm. Nhưng nó không phải, theo như tôi biết. Đây là một phiên bản cho các trục tùy ý, và cho hiệu suất tối ưu.

import numpy as np def normalized(a, axis=-1, order=2): l2 = np.atleast_1d(np.linalg.norm(a, order, axis)) l2[l2==0] = 1 return a / np.expand_dims(l2, axis) A = np.random.randn(3,3,3) print(normalized(A,0)) print(normalized(A,1)) print(normalized(A,2)) print(normalized(np.arange(3)[:,None])) print(normalized(np.arange(3)))

Bạn có thể chỉ định ord để lấy định mức L1 . Để tránh chia số 0 tôi sử dụng eps, nhưng điều đó có thể không tuyệt vời.

def normalize(v): norm=np.linalg.norm(v, ord=1) if norm==0: norm=np.finfo(v.dtype).eps return v/norm

Nếu bạn có dữ liệu đa chiều và muốn mỗi trục được chuẩn hóa thành chính nó:

def normalize(d): # d is a (n x dimension) np array d -= np.min(d, axis=0) d /= np.ptp(d, axis=0) return d

Sử dụng numpys đỉnh đến đỉnh hàm.

Điều này cũng có thể làm việc cho bạn

import numpy as np normalized_v = v / np.sqrt(np.sum(v**2))

nhưng không thành công khi v có độ dài 0.

Ngoài ra còn có chức năng unit_vector() để chuẩn hóa các vectơ trong các biến đổi phổ biến của Christoph Gohlke:

import transformations as trafo import numpy as np data = np.array([[1.0, 1.0, 0.0], [1.0, 1.0, 1.0], [1.0, 2.0, 3.0]]) print(trafo.unit_vector(data, axis=1))

Nếu bạn muốn bình thường hóa các vectơ đặc trưng n chiều được lưu trữ trong một tenxơ 3D, bạn cũng có thể sử dụng PyTorch:

import numpy as np from torch import FloatTensor from torch.nn.functional import normalize vecs = np.random.Rand(3, 16, 16, 16) norm_vecs = normalize(FloatTensor(vecs), dim=0, eps=1e-16).numpy()

Nếu bạn đang làm việc với các vectơ 3D, bạn có thể thực hiện việc này một cách chính xác bằng cách sử dụng toolbelt vg . Đó là một lớp ánh sáng trên đỉnh của numpy và nó hỗ trợ các giá trị đơn và các vectơ xếp chồng lên nhau.

import numpy as np import vg x = np.random.Rand(1000)*10 norm1 = x / np.linalg.norm(x) norm2 = vg.normalize(x) print np.all(norm1 == norm2) # True

Tôi đã tạo thư viện ở lần khởi động cuối cùng của mình, nơi nó được thúc đẩy bởi những cách sử dụng như thế này: những ý tưởng đơn giản quá dài dòng trong NumPy.

Nếu bạn không cần độ chính xác tối đa, chức năng của bạn có thể được giảm xuống:

v_norm = v / (np.linalg.norm(v) + 1e-16)

Bạn đã đề cập đến sci-kit tìm hiểu, vì vậy tôi muốn chia sẻ một giải pháp khác.

sci-kit tìm hiểu MinMaxScaler

Trong sci-kit learn, có một API có tên MinMaxScaler có thể tùy chỉnh phạm vi giá trị theo ý muốn.

Nó cũng giải quyết các vấn đề NaN cho chúng tôi.

NaN được coi là giá trị thiếu: không quan tâm đến sự phù hợp và được duy trì trong biến đổi. ... xem tài liệu tham khảo [1]

Mẫu mã

Mã rất đơn giản, chỉ cần gõ

# Let's say X_train is your input dataframe from sklearn.preprocessing import MinMaxScaler # call MinMaxScaler object min_max_scaler = MinMaxScaler() # feed in a numpy array X_train_norm = min_max_scaler.fit_transform(X_train.values) # wrap it up if you need a dataframe df = pd.DataFrame(X_train_norm)
  • [1] sklearn.pre Processing.MinMaxScaler

Không có sklearn và chỉ sử dụng numpy. Chỉ cần xác định một chức năng :.

Giả sử các hàng là các biến và các cột của các mẫu (axis= 1) :

import numpy as np # Example array X = np.array([[1,2,3],[4,5,6]]) def stdmtx(X): means = X.mean(axis =1) stds = X.std(axis= 1, ddof=1) X= X - means[:, np.newaxis] X= X / stds[:, np.newaxis] return np.nan_to_num(X)

đầu ra :

X array([[1, 2, 3], [4, 5, 6]]) stdmtx(X) array([[-1., 0., 1.], [-1., 0., 1.]])

55

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi cần bình thường hóa một danh sách các giá trị để phù hợp với phân phối xác suất, tức là từ 0,0 đến 1,0.

Tôi hiểu làm thế nào để bình thường hóa, nhưng tò mò nếu Python có chức năng để tự động hóa điều này.

Tôi muốn đi từ:

raw = [0.07, 0.14, 0.07]  

đến

normed = [0.25, 0.50, 0.25]

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

Một người

7.8648 Huy hiệu vàng35 Huy hiệu bạc48 Huy hiệu đồng8 gold badges35 silver badges48 bronze badges

Đã hỏi ngày 6 tháng 11 năm 2014 lúc 17:12Nov 6, 2014 at 17:12

3

Sử dụng :

norm = [float(i)/sum(raw) for i in raw]

Để bình thường hóa so với tổng để đảm bảo rằng tổng luôn là 1.0 (hoặc càng gần càng tốt).

sử dụng

norm = [float(i)/max(raw) for i in raw]

Để bình thường hóa chống lại mức tối đa

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

shivank01

9753 Huy hiệu vàng14 Huy hiệu bạc35 Huy hiệu Đồng3 gold badges14 silver badges35 bronze badges

Đã trả lời ngày 6 tháng 11 năm 2014 lúc 17:17Nov 6, 2014 at 17:17

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

Tony Suffolk 66tony Suffolk 66Tony Suffolk 66

8.9983 Huy hiệu vàng29 Huy hiệu bạc33 Huy hiệu đồng3 gold badges29 silver badges33 bronze badges

3

Nếu danh sách của bạn có số âm, đây là cách bạn sẽ bình thường hóa nó

a = range(-30,31,5)
norm = [(float(i)-min(a))/(max(a)-min(a)) for i in a]

Đã trả lời ngày 2 tháng 5 năm 2018 lúc 19:05May 2, 2018 at 19:05

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

blaylockbkblaylockbkblaylockbk

2.0572 Huy hiệu vàng27 Huy hiệu bạc39 Huy hiệu Đồng2 gold badges27 silver badges39 bronze badges

Đối với những người muốn sử dụng Scikit-learn, bạn có thể sử dụng

from sklearn.preprocessing import normalize

x = [1,2,3,4]
normalize([x]) # array([[0.18257419, 0.36514837, 0.54772256, 0.73029674]])
normalize([x], norm="l1") # array([[0.1, 0.2, 0.3, 0.4]])
normalize([x], norm="max") # array([[0.25, 0.5 , 0.75, 1.]])

Đã trả lời ngày 26 tháng 8 năm 2020 lúc 13:48Aug 26, 2020 at 13:48

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

Anh-Thi Dinhanh-Thi DinhAnh-Thi DINH

1.4751 Huy hiệu vàng20 Huy hiệu bạc16 Huy hiệu đồng1 gold badge20 silver badges16 bronze badges

1

Danh sách bạn sẽ bình thường hóa trong bao lâu?

def psum(it):
    "This function makes explicit how many calls to sum() are done."
    print "Another call!"
    return sum(it)

raw = [0.07,0.14,0.07]
print "How many calls to sum()?"
print [ r/psum(raw) for r in raw]

print "\nAnd now?"
s = psum(raw)
print [ r/s for r in raw]

# if one doesn't want auxiliary variables, it can be done inside
# a list comprehension, but in my opinion it's quite Baroque    
print "\nAnd now?"
print [ r/s  for s in [psum(raw)] for r in raw]

Đầu ra

# How many calls to sum()?
# Another call!
# Another call!
# Another call!
# [0.25, 0.5, 0.25]
# 
# And now?
# Another call!
# [0.25, 0.5, 0.25]
# 
# And now?
# Another call!
# [0.25, 0.5, 0.25]

Đã trả lời ngày 6 tháng 11 năm 2014 lúc 17:32Nov 6, 2014 at 17:32

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

Gboffigboffigboffi

20.4K6 Huy hiệu vàng54 Huy hiệu bạc83 Huy hiệu Đồng6 gold badges54 silver badges83 bronze badges

0

try:

normed = [i/sum(raw) for i in raw]

normed
[0.25, 0.5, 0.25]

Đã trả lời ngày 6 tháng 11 năm 2014 lúc 17:18Nov 6, 2014 at 17:18

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

AnzelanzelAnzel

19.1k5 Huy hiệu vàng48 Huy hiệu bạc52 Huy hiệu Đồng5 gold badges48 silver badges52 bronze badges

Không có bất kỳ chức năng nào trong thư viện tiêu chuẩn (theo hiểu biết của tôi) sẽ làm điều đó, nhưng có những mô -đun hoàn toàn có chức năng như vậy. Tuy nhiên, nó đủ dễ dàng để bạn có thể viết chức năng của riêng mình:

def normalize(lst):
    s = sum(lst)
    return map(lambda x: float(x)/s, lst)

Đầu ra mẫu:

normed = [0.25, 0.50, 0.25]
0

Đã trả lời ngày 6 tháng 11 năm 2014 lúc 17:19Nov 6, 2014 at 17:19

wnnmawwnnmawwnnmaw

5.2942 Huy hiệu vàng35 Huy hiệu bạc62 Huy hiệu Đồng2 gold badges35 silver badges62 bronze badges

2

Nếu bạn cân nhắc sử dụng

normed = [0.25, 0.50, 0.25]
9, bạn có thể nhận được giải pháp nhanh hơn.

normed = [0.25, 0.50, 0.25]
1

Đã trả lời ngày 18 tháng 9 năm 2018 lúc 12:16Sep 18, 2018 at 12:16

TengeryetengeryeTengerye

1.4991 Huy hiệu vàng19 Huy hiệu bạc37 Huy hiệu đồng1 gold badge19 silver badges37 bronze badges

2

Thử cái này :

normed = [0.25, 0.50, 0.25]
2

Điều này sẽ làm những gì bạn yêu cầu. Nhưng tôi sẽ đề nghị thử bình thường hóa Min-Max.But I will suggest to try Min-Max normalization.

Bình thường hóa Min-Max:

normed = [0.25, 0.50, 0.25]
3

Đã trả lời ngày 29 tháng 3 năm 2018 lúc 7:43Mar 29, 2018 at 7:43

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

1

Nếu làm việc với dữ liệu, nhiều lần

norm = [float(i)/sum(raw) for i in raw]
0 là chìa khóa đơn giản

Mã cụ thể này sẽ đặt

norm = [float(i)/sum(raw) for i in raw]
1 vào một cột, sau đó bình thường hóa theo cột mỗi hàng. .

normed = [0.25, 0.50, 0.25]
4

Trường hợp

norm = [float(i)/sum(raw) for i in raw]
3 sẽ hiển thị như:

normed = [0.25, 0.50, 0.25]
5

Và sau đó có thể tiếp tục chơi với dữ liệu, quá!

Đã trả lời ngày 2 tháng 3 năm 2020 lúc 0:01Mar 2, 2020 at 0:01

Dưới đây là một lớp lót không thể tựa tương tự như câu trả lời hàng đầu (chỉ thực hiện tổng kết một lần)

normed = [0.25, 0.50, 0.25]
6

Một phương pháp tương tự có thể được thực hiện cho một danh sách có số âm

normed = [0.25, 0.50, 0.25]
7

Đã trả lời ngày 2 tháng 3 năm 2021 lúc 14:20Mar 2, 2021 at 14:20

Hướng dẫn normalize a list python - bình thường hóa một danh sách python

Jeff Hykinjeff HykinJeff Hykin

1.40915 huy hiệu bạc24 Huy hiệu đồng15 silver badges24 bronze badges

Sử dụng Scikit-learn:

normed = [0.25, 0.50, 0.25]
8

Đã trả lời ngày 24 tháng 12 năm 2020 lúc 8:01Dec 24, 2020 at 8:01

Keramatkeramatkeramat

4.1405 Huy hiệu vàng23 Huy hiệu bạc35 Huy hiệu Đồng5 gold badges23 silver badges35 bronze badges