Bagaimana cara menormalkan data hingga rentang 0-1?


266

Saya tersesat dalam normalisasi, dapatkah seseorang membimbing saya?

Saya memiliki nilai minimum dan maksimum, masing-masing -23,89 dan 7,54990767.

Jika saya mendapatkan nilai 5,6878 bagaimana saya bisa skala nilai ini pada skala 0 hingga 1.


8
apakah ini caranya = (nilai-min) / (maks-mnt)
Angelo

3
Ini dapat membantu Anda membaca utas ini: cara-memverifikasi-distribusi-dinormalisasi . Jika itu menjawab pertanyaan Anda, Anda dapat menghapus Q ini; jika tidak, edit Q Anda untuk menentukan apa yang Anda masih tidak mengerti.
gung

1
Penjelasan perlindungan: Pertanyaan ini menarik jawaban ekstra yang hanya berisi solusi kode. Walaupun ini mungkin menarik atau bermanfaat bagi beberapa pembaca, itu bukan tujuan CV untuk menyediakan repositori solusi kode.
Nick Cox

1
solusi yang diberikan mempertimbangkan nilai kontras linier - apakah Anda menginginkan normalisasi yang berbeda, misalnya yang mencapai probabilitas seragam untuk output?
meduz

Jawaban:


299

Jika Anda ingin menormalkan data Anda, Anda dapat melakukannya seperti yang Anda sarankan dan hanya menghitung yang berikut ini:

zi=ximin(x)max(x)min(x)

di mana dan sekarang adalah data normalisasi . Sebagai bukti konsep (walaupun Anda tidak memintanya) berikut adalah beberapa kode dan grafik yang menyertai untuk menggambarkan hal ini:x=(x1,...,xn)ziithR

masukkan deskripsi gambar di sini

# Example Data
x = sample(-100:100, 50)

#Normalized Data
normalized = (x-min(x))/(max(x)-min(x))

# Histogram of example data and normalized data
par(mfrow=c(1,2))
hist(x,          breaks=10, xlab="Data",            col="lightblue", main="")
hist(normalized, breaks=10, xlab="Normalized Data", col="lightblue", main="")

11
Saya hanya bertanya-tanya bagaimana dua histogram yang tampak sangat berbeda melakukan illustrate the pointjawaban Anda (benar)?
ttnphns

12
@ttnphns Mereka hanya terlihat berbeda karena binning dari histogram. Maksud saya adalah untuk menunjukkan bahwa nilai-nilai asli hidup antara -100 hingga 100 dan sekarang setelah normalisasi mereka hidup antara 0 dan 1. Saya bisa menggunakan grafik yang berbeda untuk menunjukkan ini saya kira atau hanya ringkasan statistik.

20
Dorongan lembut oleh @ttnphns dimaksudkan untuk mendorong Anda tidak hanya menggunakan cara yang tidak terlalu rumit untuk menggambarkan ide (sederhana), tetapi juga (saya curiga) sebagai petunjuk bahwa ilustrasi yang lebih langsung relevan mungkin bermanfaat di sini. Anda dapat melakukan keduanya dengan menemukan cara yang lebih mudah untuk membuat grafik transformasi ketika diterapkan pada min dan max yang sebenarnya disediakan oleh OP
whuber

1
Apakah ada cara untuk "menormalkan" ke rentang kustom alih-alih 0-1?
John Demetriou

1
@JohnDemetriou Mungkin bukan solusi terbersih, tetapi Anda bisa menskalakan nilai yang dinormalisasi untuk melakukan itu. Jika Anda ingin rentang misalnya 0-100, Anda hanya mengalikan setiap angka dengan 100. Jika Anda ingin rentang yang tidak dimulai dengan 0, seperti 10-100, Anda akan melakukannya dengan penskalaan dengan MAX-MIN dan kemudian ke nilai yang Anda dapatkan dari itu hanya dengan menambahkan MIN. Jadi skala dengan 90, lalu tambahkan 10. Itu harus cukup untuk sebagian besar rentang kustom yang Anda inginkan.
Alexander Rossa

47

Rumus satu baris umum untuk secara linier menskala ulang nilai data setelah mengamati min dan maks ke dalam kisaran arbitrer baru min ' to max' adalah

  newvalue= (max'-min')/(max-min)*(value-max)+max'
  or
  newvalue= (max'-min')/(max-min)*(value-min)+min'.

9
Ini benar, tetapi tidak efisien. Ini adalah transformasi linier, jadi Anda akan menghitung sebelumnya adan bkonstanta, dan kemudian hanya berlaku newvalue = a * value + b. a = (max'-min')/(max-min)danb = max - a * max
Mark Lakata

1
Apakah Anda tahu cara mengutip ini? Maksud saya, adakah referensi "asli" di suatu tempat?
Trefex

3
@MarkLakata Koreksi sedikit (salah ketik?): b = max' - a * maxAtaub = min' - (a * min)
Nick

@Nick - ya. Saya melewatkan '
Mark Lakata

Bisakah Anda membandingkan normalisasi Anda di sini se.mathworks.com/matlabcentral/answers/… yaitu persamaan u = -1 + 2.*(u - min(u))./(max(u) - min(u));.
Léo Léopold Hertz 준영

13

Berikut ini adalah implementasi PHP saya untuk normalisasi:

function normalize($value, $min, $max) {
	$normalized = ($value - $min) / ($max - $min);
	return $normalized;
}

Tetapi ketika saya sedang membangun jaringan syaraf tiruan saya sendiri, saya perlu mengubah output yang dinormalisasi kembali ke data asli untuk mendapatkan output yang baik untuk grafik.

function denormalize($normalized, $min, $max) {
	$denormalized = ($normalized * ($max - $min) + $min);
	return $denormalized;
}

$int = 12;
$max = 20;
$min = 10;

$normalized = normalize($int, $min, $max); // 0.2
$denormalized = denormalize($normalized, $min, $max); //12

Denormalisasi menggunakan rumus berikut:

x(maxmin)+min


2
Ada perbedaan penting antara jawaban ini dan jawaban yang sudah diterima. Itu menjelaskan ide utama dengan jelas dan langsung dan kemudian menunjukkan bagaimana melakukannya dalam satu program yang biasa digunakan. Sebaliknya, Anda hanya memposting kode di sini. Sementara saya senang percaya bahwa ini adalah kode yang baik (saya tidak menulis PHP) di forum ini, kami biasanya tidak memiliki setumpuk jawaban untuk setiap pertanyaan yang menjelaskan bagaimana melakukannya dalam setiap bahasa yang mungkin. Kalau tidak, kita akan memiliki jawaban di sini di SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java. Python, dll, dll.
Nick Cox

2
Saya tidak berpikir, bahwa ini adalah satu-satunya perbedaan. Dalam kode saya, saya juga menunjukkan, cara mengembalikan nilai normal ke nilai sebelum normalisasi. Saya pikir, itu layak untuk dijawab.
jankal

1
Masih benar bahwa Anda hanya memposting kode: Saya pikir Anda perlu menekankan sifat kode yang seharusnya istimewa dalam komentar, karena jika tidak, pembaca harus membaca kode untuk melihat apa itu kode. Agaknya pembalikan penskalaan hanya digunakan ketika (a) nilai asli telah ditimpa tetapi (b) pengguna dengan bijaksana ingat untuk menyimpan minimum dan maksimum. Poin saya yang lebih luas, seperti yang dikomentari di atas, adalah bahwa CV tidak bertujuan untuk menjadi gudang contoh kode.
Nick Cox

Ada beberapa masalah, di mana Anda perlu mengembalikan nilainya: Nueral Networks misalnya ... Tapi Anda benar, dalam hal analisis data, jawaban ini sangat buruk.
jankal

3
@NickCox Saya menemukan jawabannya lebih memuaskan daripada yang diterima.
Karl Morrison

4

Pembagian dengan nol

Satu hal yang perlu diingat adalah bahwa max - minbisa sama dengan nol. Dalam hal ini, Anda tidak ingin melakukan divisi itu.

Kasus di mana ini akan terjadi adalah ketika semua nilai dalam daftar yang Anda coba normalkan adalah sama. Untuk menormalkan daftar tersebut, setiap item akan menjadi 1 / length.

// JavaScript
function normalize(list) {
   var minMax = list.reduce((acc, value) => {
      if (value < acc.min) {
         acc.min = value;
      }

      if (value > acc.max) {
         acc.max = value;
      }

      return acc;
   }, {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY});

   return list.map(value => {
      // Verify that you're not about to divide by zero
      if (minMax.max === minMax.min) {
         return 1 / list.length
      }

      var diff = minMax.max - minMax.min;
      return (value - minMax.min) / diff;
   });
}

Contoh:

normalize([3, 3, 3, 3]); // output => [0.25, 0.25, 0.25, 0.25]

Ini adalah penskoran kembali ke jumlah 1, bukan ke kisaran 0-1. Saya hanya berpikir jawabannya karena itu di luar topik.
ttnphns

Tidak begitu. normalize([12, 20, 10])output [0.2, 1.0, 0.0], yang sama dengan yang Anda dapatkan (val - min) / (max - min).
rodrigo-silveira

@ rodrigo-silveira Saya tidak melihat mengapa semua output 0,25. Bukankah lebih baik semuanya 0,5? Semua item sama, jadi harus dijaga agar tetap berada di tengah interval.
javierdvalle

0

jawabannya benar tetapi saya punya saran, bagaimana jika data pelatihan Anda menghadapi beberapa angka di luar jangkauan? Anda bisa menggunakan teknik squashing. dijamin tidak akan keluar dari jangkauan. daripada ini

masukkan deskripsi gambar di sini

Saya sarankan gunakan ini

masukkan deskripsi gambar di sini

dengan squashing seperti ini di min dan max range

masukkan deskripsi gambar di sini

dan ukuran kesenjangan out-of-range yang diharapkan berbanding lurus dengan tingkat kepercayaan bahwa akan ada nilai out-of-range.

untuk informasi lebih lanjut Anda dapat google: menekan angka out-of-range dan merujuk ke buku persiapan data "dorian pyle"


5
Harap edit jawaban Anda untuk menggunakan huruf besar sebagai konvensional. Huruf kecil yang konsisten mungkin tampak lucu atau efisien, tetapi lebih sulit bagi hampir semua orang untuk membaca.
Nick Cox

3
Ilustrasi tidak cukup menjawab jawaban Anda. Apa sebenarnya "teknik squashing" itu?
whuber

0

Coba ini. Ini konsisten dengan skala fungsi

normalize <- function(x) { 
  x <- as.matrix(x)
  minAttr=apply(x, 2, min)
  maxAttr=apply(x, 2, max)
  x <- sweep(x, 2, minAttr, FUN="-") 
  x=sweep(x, 2,  maxAttr-minAttr, "/") 
  attr(x, 'normalized:min') = minAttr
  attr(x, 'normalized:max') = maxAttr
  return (x)
} 

7
Ada perbedaan penting antara jawaban ini dan jawaban yang sudah diterima. Itu menjelaskan ide utama dengan jelas dan langsung dan kemudian menunjukkan bagaimana melakukannya dalam satu program yang biasa digunakan. Sebaliknya, Anda hanya memposting kode di sini. Walaupun saya senang percaya bahwa ini adalah kode yang baik (dalam beberapa bahasa yang tidak dapat dijelaskan) di forum ini, kami biasanya tidak memiliki setumpuk jawaban untuk setiap pertanyaan yang menjelaskan bagaimana melakukannya dalam setiap bahasa yang mungkin. Kalau tidak, kita akan memiliki jawaban di sini di SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java. Python, dll, dll.
Nick Cox
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.