Saya ingin memiliki norma satu array NumPy. Lebih khusus lagi, saya mencari versi yang setara dari fungsi ini
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Apakah ada sesuatu seperti itu di dalam skearn
atau numpy
?
Fungsi ini berfungsi dalam situasi di mana v
vektor 0 berada.
raise
pengecualian!x/np.linalg.norm(x)
itu tidak jauh lebih lambat (sekitar 15-20%) daripadax/np.sqrt((x**2).sum())
di numpy 1.15.1 pada CPU.Jawaban:
Jika Anda menggunakan scikit-learn Anda dapat menggunakan
sklearn.preprocessing.normalize
:sumber
normalize
membutuhkan input 2D. Anda bisa meneruskanaxis=
argumen untuk menentukan apakah Anda ingin menerapkan normalisasi di baris atau kolom array input Anda.np.linalg.norm(x)
menghitung norma 'l2' secara default. Jika Anda ingin jumlah vektor Anda menjadi 1, Anda harus menggunakannp.linalg.norm(x, ord=1)
ndarray
berfungsi agarnormalize()
berfungsi. Kalau tidak, itu bisa alist
.Saya setuju bahwa itu baik jika fungsi seperti itu adalah bagian dari baterai yang disertakan. Tapi tidak, sejauh yang saya tahu. Ini adalah versi untuk sumbu acak, dan memberikan kinerja optimal.
sumber
Anda dapat menentukan ord untuk mendapatkan norma L1. Untuk menghindari pembagian nol saya menggunakan eps, tapi itu mungkin tidak bagus.
sumber
[inf, 1, 2]
hasil[nan, 0, 0]
, tetapi bukankah seharusnya demikian[1, 0, 0]
?Ini juga bisa bekerja untuk Anda
tetapi gagal ketika
v
memiliki panjang 0.sumber
Jika Anda memiliki data multidimensi dan ingin setiap sumbu dinormalisasi ke jumlah maksimum atau jumlahnya:
Menggunakan fungsi numpys peak to peak .
sumber
Ada juga fungsi
unit_vector()
untuk menormalkan vektor dalam modul transformasi populer oleh Christoph Gohlke:sumber
Anda menyebutkan belajar sci-kit, jadi saya ingin berbagi solusi lain.
belajar sci-kit
MinMaxScaler
Dalam pembelajaran sci-kit, ada API yang disebut
MinMaxScaler
yang dapat menyesuaikan rentang nilai yang Anda inginkan.Ini juga menangani masalah NaN bagi kami.
Contoh kode
Kode ini sederhana, cukup ketik
Referensisumber
Tanpa
sklearn
dan menggunakan adilnumpy
. Cukup tentukan fungsi :.Dengan asumsi bahwa baris adalah variabel dan kolom sampel (
axis= 1
):keluaran:
sumber
Jika Anda ingin menormalkan vektor fitur dimensi yang disimpan dalam tensor 3D, Anda juga bisa menggunakan PyTorch:
sumber
Jika Anda bekerja dengan vektor 3D, Anda dapat melakukan ini secara ringkas menggunakan toolbelt vg . Ini adalah lapisan ringan di atas numpy dan mendukung nilai tunggal dan vektor ditumpuk.
Saya membuat perpustakaan di startup terakhir saya, yang dimotivasi oleh penggunaan seperti ini: ide-ide sederhana yang terlalu bertele-tele di NumPy.
sumber
Jika Anda tidak membutuhkan presisi maksimal, fungsi Anda dapat direduksi menjadi:
sumber
Jika Anda bekerja dengan array multidimensi, ikuti solusi cepat adalah mungkin.
Katakanlah kita memiliki array 2D, yang ingin dinormalisasi dengan sumbu terakhir, sementara beberapa baris memiliki norma nol.
sumber