Veriler 0-1 aralığına nasıl normalleştirilir?


265

Normalleşmede kayboldum, biri bana yol gösterebilir mi, lütfen.

Sırasıyla -23.89 ve 7.54990767 gibi minimum ve maksimum değerlere sahibim.

5.6878 değerine sahipsem, bu değeri 0 ile 1 arasında nasıl ölçeklendirebilirim.


8
bu şekilde mi = (değer-dakika) / (maksimum-dakika)
Angelo

3
Bu konuyu okumanıza yardımcı olabilir: nasıl bir dağıtım doğrulanır, normalize edilir . Bu sorunuzu yanıtlarsa, bu Q'yi silebilirsiniz; değilse, neyi anlamadığınızı belirtmek için Q'nuzu düzenleyin.
gung

1
Korumanın açıklaması: Bu soru, yalnızca kod çözümlerini içeren ilave cevapları çekmektedir. Bunlar bazı okuyucular için ilginç veya faydalı olsalar da, kod çözümleri havuzlarını sağlamak CV'nin amacı değildir.
Nick Cox

1
Sağlanan çözümler doğrusal bir kontrast değeri olarak düşünülür - örneğin, çıktı için tek tip bir olasılık elde eden farklı bir normalleştirme ister misiniz?
meduz

Yanıtlar:


299

Verilerinizi normalleştirmek istiyorsanız, aşağıdakileri önererek basitçe hesaplayabilirsiniz:

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

burada ve şimdi sizin normalleştirilmiş verilerinizdir. Konseptin bir kanıtı olarak (siz istemediğiniz halde) bu noktayı açıklamak için bazı kodlar ve beraberinde gelen grafikler:x=(x1,...,xn)ziithR

görüntü tanımını buraya girin

# 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
Sadece oldukça farklı görünen iki histogramın illustrate the point(doğru) cevabını nasıl yaptığını merak ediyorum.
ttnphns

12
@ Ttnphns Onlar sadece histogramların binmesi nedeniyle farklı görünürler. Ancak benim açımdan, orjinal değerlerin -100 ile 100 arasında olduğunu ve şimdi normalizasyondan sonra 0 ile 1 arasında yaşadıklarını göstermekti. Bunu göstermek için farklı bir grafik kullanabilirdim.

20
@Tnphns tarafından yapılan nazik dürtük, sizi sadece (daha basit) bir fikri göstermek için daha az karmaşık bir araç kullanmanın yanı sıra, aynı zamanda (daha şüpheli) daha doğrudan ilgili bir örneklemenin burada yararlı olabileceğinin bir ipucu olarak kullanmasını da teşvik etmek anlamına geliyordu. Bunu dk uygulanan ve maksimum aslında OP tarafından tedarik edildiğinde dönüşümü grafiğini oluşturmak için daha basit bir yol bularak her iki yapabileceğini
whuber

1
0-1 yerine özel alana "normalleştirmenin" bir yolu var mı?
John Demetriou

1
@JohnDemetriou En temiz çözüm olmayabilir, ancak bunu yapmak için normalleştirilmiş değerleri ölçeklendirebilirsiniz. Örneğin 0-100 aralığı istiyorsanız, her sayıyı 100 ile çarpmanız yeterlidir. 0 ile başlamayan bir aralık istiyorsanız, 10-100 gibi, bunu MAX-MIN ve ardından ölçeklendirerek yaparsınız. ondan aldığınız değerleri yalnızca MIN ekleyin. Bu yüzden 90'a kadar ölçeklendirin, sonra 10 ekleyin. Bu, istediğiniz özel aralıkların çoğu için yeterli olmalıdır.
Alexander Rossa

47

Genel bir basit formül doğrusal gözlenen olan veri değerlerini yeniden ölçeklendirmek için min ve max yeni rasgele aralığı içine dakika için maksimum' olduğu

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

9
Bu doğru, ancak verimli değil. Doğrusal bir dönüşümdür, bu yüzden önceden hesaplar a, bsabitler ve sonra sadece uygularsınız newvalue = a * value + b. a = (max'-min')/(max-min)veb = max - a * max
Mark Lakata

1
Bunu nasıl alıntılayacağını biliyor musun? Yani, bir yerlerde "orijinal" bir referans var mı?
Trefex

3
@MarkLakata Hafif (yazım hatası?) Düzeltme: b = max' - a * maxya dab = min' - (a * min)
Nick,

@Nick - evet. Ben bir 'özlüyorum'
Mark Lakata

Lütfen normalleştirmenizi burada karşılaştırabilir misiniz se.mathworks.com/matlabcentral/answers/… yani denklem u = -1 + 2.*(u - min(u))./(max(u) - min(u));.
Léo Léopold Hertz 준영

13

İşte benim normalleştirme için PHP uygulaması:

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

Ancak kendi yapay sinir ağlarımı oluştururken, normalleştirilmiş çıktıyı grafik için iyi okunabilir çıktı elde etmek için orijinal verilere geri dönüştürmem gerekiyordu.

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

Denormalizasyon aşağıdaki formülü kullanır:

x(maxmin)+min


2
Bu cevapla daha önce kabul edilmiş olan cevap arasında önemli bir fark var. Bu, ana fikri açık ve doğrudan açıkladı ve ikincil olarak, sık kullanılan bir programda nasıl yapılacağını gösterdi. Tersine, burada sadece kod gönderirsiniz. Bu forumda bunun iyi bir kod (PHP yazmıyorum) olduğuna inanmaktan mutlu olmama rağmen, normalde akla gelebilecek her dilde nasıl yapılacağını açıklayan her sorunun cevabını bir paketimiz yoktur. Aksi takdirde, burada SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java cevapları olurdu. Python, vb.
Nick Cox

2
Bunun tek fark olduğunu sanmıyorum. Kodumda da normalize edilmiş bir değerin normalizasyondan önceki değere nasıl döndürüleceğini gösterdim. Bence bu, bu cevaba değdi.
jankal

1
Yalnızca kod gönderdiğiniz hala doğrudur: Bence yorumlarda sözde özel kod erdemlerini vurgulamanız gerekir, aksi takdirde okuyucular ne olduklarını görmek için kodu okumak zorundadır. Muhtemelen ölçeklendirmenin tersine çevrilmesi, yalnızca (a) orijinal değerlerin üzerine yazıldığında kullanılır (b), kullanıcı minimum ve maksimum değerleri kaydetmeyi özenle hatırlar. Yukarıda açıkladığım gibi daha geniş bir noktaya göre CV, kod örneklerinin bir deposu olmayı hedeflemiyor.
Nick Cox,

Bazı problemler var, değeri geri yüklemek istediğinizde: Örneğin Nueral Networks ... Ama haklısınız, veri analizi açısından bu cevap çok kötü.
jankal

3
@NickCox Cevabını kabul edilenden daha tatmin edici buldum.
Karl Morrison

4

Sıfıra bölüm

Akılda tutulması gereken bir şey max - minsıfıra eşit olabilir. Bu durumda, bu bölümü yapmak istemezsiniz.

Bunun olacağı durum, listeyi normalize etmeye çalıştığınız tüm değerler aynı olduğunda. Böyle bir listeyi normalleştirmek için her öğe olacaktır 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;
   });
}

Örnek:

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

Bu, 0-1 aralığına değil toplam 1'e yeniden ölçeklendirmedir. Bence cevabın konu dışı olduğunu düşünüyorum.
ttnphns,

Öyle değil. normalize([12, 20, 10])çıktılar [0.2, 1.0, 0.0], ki alacağınız ile aynı (val - min) / (max - min).
rodrigo-silveira

@ rodrigo-silveira Neden tüm 0.25 çıktısını anlamıyorum. Tüm 0.5 daha iyi değil mi? Tüm öğeler eşittir, bu nedenle aralıkta ortalanmalıdır.
javierdvalle

0

Cevap doğru ama bir önerim var, ya eğitim verileriniz belirli bir sayı dışında kalıyorsa? ezme tekniğini kullanabilirsiniz. menzil dışına çıkmama garantisi verilecek. bundan ziyade

görüntü tanımını buraya girin

bunu kullanmanızı öneririm

görüntü tanımını buraya girin

Min ve maksimum menzil içinde bu gibi ezme ile

görüntü tanımını buraya girin

ve beklenen aralık dışı aralığın boyutu, aralık dışı değerlerin olacağına dair güven derecesi ile doğru orantılıdır.

Daha fazla bilgi için Google'a başvurabilirsiniz: aralık dışı sayıları ezmek ve "dorian pyle" veri hazırlama kitabına bakınız.


5
Büyük harfleri geleneksel olarak kullanmak için lütfen cevabınızı düzenleyin. Tutarlı küçük harf eğlenceli veya verimli görünebilir, ancak neredeyse herkesin okuması daha zordur.
Nick Cox

3
Resimler, cevabınızı yeterince iletmiyor. Tam olarak "ezme tekniği" nedir?
whuber

0

Bunu dene. İşlev ölçeği ile tutarlıdır

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
Bu cevapla daha önce kabul edilmiş olan cevap arasında önemli bir fark var. Bu, ana fikri açık ve doğrudan açıkladı ve ikincil olarak, sık kullanılan bir programda nasıl yapılacağını gösterdi. Tersine, burada sadece kod gönderirsiniz. Bu forumda bunun iyi bir kod (bazı açıklanamayan bir dilde) olduğuna inanmaktan mutlu olmama rağmen, normal olarak akla gelebilecek her dilde nasıl yapılacağını açıklayan her sorunun cevabını bir paketine sahip değiliz. Aksi takdirde, burada SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java cevapları olurdu. Python, vb.
Nick Cox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.