Wie normalisiere ich Daten auf 0-1?


265

Ich bin in der Normalisierung verloren, könnte mich jemand bitte führen.

Ich habe einen minimalen und einen maximalen Wert, sagen wir -23,89 bzw. 7,54990767.

Wenn ich einen Wert von 5,6878 erhalte, wie kann ich diesen Wert auf einer Skala von 0 bis 1 skalieren?


8
Ist dies der Weg = (Wert-min) / (max-min)
Angelo

3
Es kann Ihnen helfen, diesen Thread zu lesen: Wie-überprüft-man-eine-Distribution-ist-normalisiert . Wenn dies Ihre Frage beantwortet, können Sie dieses Q löschen. Wenn nicht, bearbeiten Sie Ihr Q, um anzugeben, was Sie immer noch nicht verstehen.
gung

1
Erklärung des Schutzes: Diese Frage zieht zusätzliche Antworten an, die nur Codelösungen enthalten. Während diese für einige Leser interessant oder nützlich sein mögen, ist es nicht das Ziel des Lebenslaufs, Repositorys für Codelösungen bereitzustellen.
Nick Cox

1
Die angebotenen Lösungen berücksichtigen einen linearen Kontrastwert. Möchten Sie eine andere Normierung, zum Beispiel eine, die eine einheitliche Wahrscheinlichkeit für die Ausgabe erzielt?
Meduz

Antworten:


299

Wenn Sie Ihre Daten normalisieren möchten, können Sie dies wie vorgeschlagen tun und einfach Folgendes berechnen:

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

Wobei und jetzt Ihre normalisierten Daten sind. Als Proof-of-Concept (obwohl Sie nicht danach gefragt haben) finden Sie hier einen Code und ein begleitendes Diagramm, um diesen Punkt zu veranschaulichen:x=(x1,...,xn)ziithR

Bildbeschreibung hier eingeben

# 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
Ich frage mich nur, wie die beiden ganz unterschiedlich aussehenden Histogramme illustrate the pointIhrer (richtigen) Antwort entsprechen.
TTNPHNS

12
@ttnphns Sie sehen nur aufgrund der Gruppierung der Histogramme anders aus. Mein Punkt war jedoch zu zeigen, dass die ursprünglichen Werte zwischen -100 und 100 lagen und jetzt nach der Normalisierung zwischen 0 und 1. Ich hätte ein anderes Diagramm verwenden können, um dies zu zeigen, nehme ich an, oder nur eine zusammenfassende Statistik.

20
Das sanfte Anstupsen durch @ttnphns sollte Sie nicht nur dazu ermutigen, ein weniger kompliziertes Mittel zur Veranschaulichung einer (einfachen) Idee zu verwenden, sondern (ich vermute) auch als Hinweis darauf, dass eine direktere Veranschaulichung hier von Vorteil sein könnte. Sie könnten beides tun, indem Sie einen einfacheren Weg finden, um die Transformation grafisch darzustellen, wenn sie auf die vom OP tatsächlich gelieferten
Min-

1
Gibt es eine Möglichkeit, den benutzerdefinierten Bereich anstelle von 0-1 zu "normalisieren"?
John Demetriou

1
@JohnDemetriou Ist vielleicht nicht die sauberste Lösung, aber Sie können die normalisierten Werte skalieren, um dies zu tun. Wenn Sie zum Beispiel einen Bereich von 0-100 wollen, multiplizieren Sie einfach jede Zahl mit 100. Wenn Sie einen Bereich wollen, der nicht mit 0 beginnt, wie zum Beispiel 10-100, tun Sie dies durch Skalieren mit MAX-MIN und dann mit Werte, die Sie durch Addition der MIN erhalten. Skalieren Sie also um 90 und fügen Sie dann 10 hinzu. Das sollte für die meisten benutzerdefinierten Bereiche ausreichen, die Sie möchten.
Alexander Rossa

47

Die allgemeine einzeilige Formel zum linearen Skalieren von Datenwerten, die min und max beobachtet haben, in einen neuen willkürlichen Bereich von min ' bis max' ist

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

9
Das ist richtig, aber nicht effizient. Da es sich um eine lineare Transformation handelt, würden Sie vorberechnen aund bKonstanten und dann einfach anwenden newvalue = a * value + b. a = (max'-min')/(max-min)undb = max - a * max
Mark Lakata

1
Wissen Sie, wie man das zitiert? Ich meine, gibt es irgendwo eine "originale" Referenz?
Trefex

3
@ MarkLakata Leichte (Tippfehler?) Korrektur: b = max' - a * maxoderb = min' - (a * min)
Nick

@ Nick - ja. Mir fehlt ein '
Mark Lakata

Kannst du bitte deine Normalisierung hier vergleichen ? Se.mathworks.com/matlabcentral/answers/… ie the equation u = -1 + 2.*(u - min(u))./(max(u) - min(u));.
Léo Léopold Hertz 준영

13

Hier ist meine PHP-Implementierung zur Normalisierung:

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

Aber während ich meine eigenen künstlichen neuronalen Netze aufbaute, musste ich die normalisierte Ausgabe wieder in die ursprünglichen Daten umwandeln, um eine gut lesbare Ausgabe für den Graphen zu erhalten.

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

Bei der Denormalisierung wird die folgende Formel verwendet:

x(maxmin)+min


2
Es gibt einen wichtigen Unterschied zwischen dieser Antwort und der bereits akzeptierten Antwort. Das erklärte die Hauptidee klar und direkt und zeigte dann zweitens, wie man es in einem häufig verwendeten Programm macht. Umgekehrt posten Sie hier nur Code. Ich bin froh zu glauben, dass dies in diesem Forum ein guter Code ist (ich schreibe kein PHP), aber normalerweise haben wir nicht für jede Frage ein Bündel von Antworten, in denen erklärt wird, wie dies in jeder erdenklichen Sprache zu tun ist. Andernfalls hätten wir hier Antworten in SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java. Python usw.
Nick Cox

2
Ich denke nicht, dass dies der einzige Unterschied ist. In meinem Code habe ich auch gezeigt, wie ein normalisierter Wert auf den Wert vor der Normalisierung zurückgesetzt wird. Ich denke, das ist die Antwort wert.
Jankal

1
Es ist immer noch wahr, dass Sie nur Code posten: Ich denke, Sie müssen in Kommentaren alle angeblich besonderen Tugenden des Codes hervorheben, da ansonsten die Leser den Code lesen müssen, um zu sehen, was sie sind. Vermutlich ist eine Umkehrung der Skalierung nur dann sinnvoll, wenn (a) die ursprünglichen Werte überschrieben wurden, (b) der Benutzer jedoch mit Bedacht daran gedacht hat, das Minimum und das Maximum zu speichern. Mein größerer Punkt ist, wie oben erwähnt, dass der Lebenslauf nicht darauf abzielt, eine Sammlung von Codebeispielen zu sein.
Nick Cox

Es gibt einige Probleme, bei denen Sie den Wert wiederherstellen müssen: Nueral Networks zum Beispiel ... Aber Sie haben Recht, in Bezug auf die Datenanalyse ist diese Antwort sehr schlecht.
Jankal

3
@ NickCox Ich fand seine Antwort zufriedenstellender als die akzeptierte.
Karl Morrison

4

Durch Null teilen

Eine Sache zu beachten ist, dass max - mingleich Null sein könnte. In diesem Fall möchten Sie diese Unterteilung nicht durchführen.

In diesem Fall stimmen alle Werte in der Liste, die Sie zu normalisieren versuchen, überein. Um eine solche Liste zu normalisieren, wäre jeder Punkt 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;
   });
}

Beispiel:

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

Dies ist eine Neuskalierung auf eine Summe von 1 und nicht auf einen Bereich von 0 bis 1. Ich denke nur, dass die Antwort deswegen vom Thema abweicht.
ttnphns

Nicht so. normalize([12, 20, 10])Ausgänge [0.2, 1.0, 0.0], was das gleiche ist, das Sie mit bekommen würden (val - min) / (max - min).
Rodrigo-Silveira

@ rodrigo-silveira ich verstehe nicht warum die alle 0,25 ausgeben. Ist es nicht besser, alle 0,5? Alle Elemente sind gleich und sollten daher im Intervall zentriert bleiben.
Javierdvalle

0

Die Antwort ist richtig, aber ich habe einen Vorschlag, was ist, wenn Ihre Trainingsdaten auf eine Zahl außerhalb des Bereichs treffen? Sie könnten Squashing-Technik verwenden. Es wird garantiert, dass es niemals aus der Reichweite kommt. lieber als das

Bildbeschreibung hier eingeben

Ich empfehle dies zu verwenden

Bildbeschreibung hier eingeben

mit Quetschen wie folgt in min und max Reichweite

Bildbeschreibung hier eingeben

und die Größe der erwarteten Lücke außerhalb des Bereichs ist direkt proportional zum Grad der Gewissheit, dass es Werte außerhalb des Bereichs geben wird.

Für weitere Informationen können Sie google: die außerhalb des Bereichs liegenden Zahlen quetschen und sich auf das Datenvorbereitungsbuch von "dorian pyle" beziehen.


5
Bearbeiten Sie Ihre Antwort, um die Großschreibung wie gewohnt zu verwenden. Konsequente Kleinschreibung mag amüsant oder effizient erscheinen, aber es ist für fast alle schwieriger zu lesen.
Nick Cox

3
Die Abbildungen vermitteln Ihre Antwort nicht ausreichend. Was genau ist eine "Quetschtechnik"?
Whuber

0

Versuche dies. Er steht im Einklang mit der Funktion Skala

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
Es gibt einen wichtigen Unterschied zwischen dieser Antwort und der bereits akzeptierten Antwort. Das erklärte die Hauptidee klar und direkt und zeigte dann zweitens, wie man es in einem häufig verwendeten Programm macht. Umgekehrt posten Sie hier nur Code. Obwohl ich froh bin zu glauben, dass dies ein guter Code (in einer unerklärlichen Sprache) in diesem Forum ist, haben wir normalerweise nicht für jede Frage ein Bündel von Antworten, in denen erklärt wird, wie dies in jeder denkbaren Sprache zu tun ist. Andernfalls hätten wir hier Antworten in SAS, SPSS, Stata, MATLAB, C, C ++, C #, Java. Python usw.
Nick Cox
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.