Hướng dẫn normalize function python - bình thường hóa chức năng 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

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.]])

Tại đây, mã để chuẩn hóa bộ dữ liệu nhà ở bằng MinMaxScaler:

MinMaxScaler

Bạn có thể thấy rằng các giá trị trong đầu ra nằm giữa (0 và 1).

MinMaxScaler cũng cung cấp cho bạn tùy chọn để chọn phạm vi tính năng. Theo mặc định, phạm vi được đặt thành (0,1). Hãy cùng xem cách thay đổi phạm vi thành (0,2).

Phạm vi: (0,2)feature scaling.

Các giá trị trong đầu ra bây giờ nằm ​​trong khoảng (0,2).

Hướng dẫn normalize function python - bình thường hóa chức năng python
Sự kết luận

Đây là hai phương pháp để bình thường hóa dữ liệu trong Python. Chúng tôi đã đề cập đến hai phương pháp bình thường hóa dữ liệu theo Sklearn. Hy vọng bạn đã có niềm vui học hỏi với chúng tôi!

Trong hướng dẫn này, chúng tôi sẽ tìm hiểu về cách bình thường hóa dữ liệu trong Python. Trong khi bình thường hóa chúng tôi thay đổi thang đo của dữ liệu. Dữ liệu thường được định dạng lại để rơi vào khoảng 0-1.

Tại sao chúng ta cần bình thường hóa dữ liệu trong Python?

Các thuật toán học máy có xu hướng thực hiện tốt hơn hoặc hội tụ nhanh hơn khi các tính năng khác nhau (biến) ở quy mô nhỏ hơn. Do đó, thông thường là bình thường hóa dữ liệu trước khi đào tạo các mô hình học máy trên đó.sklearn.

Chuẩn hóa cũng làm cho quá trình đào tạo ít nhạy cảm hơn với quy mô của các tính năng. Điều này dẫn đến việc có được hệ số tốt hơn sau khi đào tạo.

Quá trình làm cho các tính năng phù hợp hơn để đào tạo bằng cách tái định cư được gọi là tỷ lệ tính năng.

from sklearn import preprocessing

Công thức chuẩn hóa được đưa ra dưới đây:

import numpy as np
x_array = np.array([2,3,5,6,7,4,8,7,6])

Bình thường hóa

normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

Chúng tôi trừ đi giá trị tối thiểu từ mỗi mục và sau đó chia kết quả cho phạm vi. Trong đó phạm vi là sự khác biệt giữa giá trị tối đa và giá trị tối thiểu.

Các bước để bình thường hóa dữ liệu trong Python

from sklearn import preprocessing
import numpy as np
x_array = np.array([2,3,5,6,7,4,8,7,6])
normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

Đầu ra:

[0.11785113, 0.1767767 , 0.29462783, 0.35355339, 0.41247896,
        0.23570226, 0.47140452, 0.41247896, 0.35355339]

Bạn có thể thấy rằng cột cho Total_bedroom trong đầu ra khớp với giá trị chúng tôi đã ở trên sau khi chuyển đổi nó thành một mảng và sau đó bình thường hóa.

Sử dụng MinMaxScaler () để bình thường hóa dữ liệu trong Python

Sklearn cung cấp một tùy chọn khác khi bình thường hóa dữ liệu: MinMaxScaler.

Đây là một lựa chọn phổ biến hơn để bình thường hóa bộ dữ liệu.

Tại đây, mã để chuẩn hóa bộ dữ liệu nhà ở bằng MinMaxScaler:

MinMaxScaler

import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")

Bạn có thể thấy rằng các giá trị trong đầu ra nằm giữa (0 và 1).

from sklearn import preprocessing
x_array = np.array(housing['total_bedrooms'])
normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

Đầu ra:

[[0.01437454 0.02129852 0.00194947 ... 0.00594924 0.00618453 0.00336115]]

MinMaxScaler cũng cung cấp cho bạn tùy chọn để chọn phạm vi tính năng. Theo mặc định, phạm vi được đặt thành (0,1). Hãy cùng xem cách thay đổi phạm vi thành (0,2).

Phạm vi: (0,2)

from sklearn import preprocessing
import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")
d = preprocessing.normalize(housing)
scaled_df = pd.DataFrame(d, columns=names)
scaled_df.head()

Đầu ra:

Hướng dẫn normalize function python - bình thường hóa chức năng python
Bình thường hóa một bộ dữ liệu

Ở đây các giá trị được chuẩn hóa dọc theo các hàng, có thể rất không trực quan. Bình thường hóa dọc theo các hàng có nghĩa là mỗi mẫu riêng lẻ được chuẩn hóa thay vì các tính năng.

Tuy nhiên, bạn có thể chỉ định trục trong khi gọi phương thức để bình thường hóa cùng một tính năng (cột).

Giá trị của tham số trục được đặt thành 1 theo mặc định. Nếu chúng ta thay đổi giá trị thành 0, quá trình chuẩn hóa hóa xảy ra dọc theo một cột.

from sklearn import preprocessing
import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")
d = preprocessing.normalize(housing, axis=0)
scaled_df = pd.DataFrame(d, columns=names)
scaled_df.head()

Đầu ra:

Hướng dẫn normalize function python - bình thường hóa chức năng python

Bạn có thể thấy rằng cột cho Total_bedroom trong đầu ra khớp với giá trị chúng tôi đã ở trên sau khi chuyển đổi nó thành một mảng và sau đó bình thường hóa.

Sử dụng MinMaxScaler () để bình thường hóa dữ liệu trong Python

Sklearn cung cấp một tùy chọn khác khi bình thường hóa dữ liệu: MinMaxScaler.

Đây là một lựa chọn phổ biến hơn để bình thường hóa bộ dữ liệu.

Tại đây, mã để chuẩn hóa bộ dữ liệu nhà ở bằng MinMaxScaler:

import numpy as np
x_array = np.array([2,3,5,6,7,4,8,7,6])
0

Đầu ra:

Hướng dẫn normalize function python - bình thường hóa chức năng python
Bạn có thể thấy rằng cột cho Total_bedroom trong đầu ra khớp với giá trị chúng tôi đã ở trên sau khi chuyển đổi nó thành một mảng và sau đó bình thường hóa.

Sử dụng MinMaxScaler () để bình thường hóa dữ liệu trong Python(0 and 1).

MinMaxScaler cũng cung cấp cho bạn tùy chọn để chọn phạm vi tính năng.Theo mặc định, phạm vi được đặt thành (0,1).Hãy cùng xem cách thay đổi phạm vi thành (0,2).

import numpy as np
x_array = np.array([2,3,5,6,7,4,8,7,6])
1

Đầu ra:

Hướng dẫn normalize function python - bình thường hóa chức năng python
Phạm vi: (0,2)

Các giá trị trong đầu ra bây giờ nằm trong khoảng (0,2).

Sự kết luận

Đây là hai phương pháp để bình thường hóa dữ liệu trong Python.Chúng tôi đã đề cập đến hai phương pháp bình thường hóa dữ liệu theo Sklearn.Hy vọng bạn đã có niềm vui học hỏi với chúng tôi!