Normalisierung dataset mit ruby
-
19-09-2019 - |
Frage
Ich habe ein Daten-set reicht von 1 zu 30.000
Ich will zu normalisieren, so dass es wird 0,1 bis 10
Was ist die beste Methode/Funktion zu tun?
Wäre sehr dankbar wenn Sie könnte geben einige Beispiel-code!
Lösung
Hier ist ein Code-Schnipsel, vorausgesetzt, Sie wollen eine linear Normalisierung. Es ist eine sehr vereinfachte Version (nur gerade Code, keine Methoden), so können Sie sehen, „wie es funktioniert“ und kann es etwas gelten.
xmin = 1.0
xmax = 30000.0
ymin = 0.1
ymax = 10.0
xrange = xmax-xmin
yrange = ymax-ymin
y = ymin + (x-xmin) * (yrange / xrange)
Und hier wird es als eine Funktion durchgeführt:
def normalise(x, xmin, xmax, ymin, ymax)
xrange = xmax - xmin
yrange = ymax - ymin
ymin + (x - xmin) * (yrange.to_f / xrange)
end
puts normalise(2000, 1, 30000, 0.1, 10)
(Hinweis: Die to_f
stellt sicher, wir fallen nicht in das schwarze Loch der Integer-Division)
Andere Tipps
Hier ist der Ruby-Way für den gemeinsamen Fall eines Arrays min auf 0,0 und max auf 1,0 einstellen.
class Array
def normalize!
xMin,xMax = self.minmax
dx = (xMax-xMin).to_f
self.map! {|x| (x-xMin) / dx }
end
end
a = [3.0, 6.0, 3.1416]
a.normalize!
=> [0.0, 1.0, 0.047199999999999985]
Für ein min und max andere als 0 und 1, Argumente hinzufügen, in der Art von Elfstrom Antwort auf normalize!
.
Dies ist eine bekannte Art und Weise zu skalieren, eine Sammlung von zahlen.Es hat mehr genaue Bezeichnung, aber ich kann mich nicht erinnern, und nicht, google es.
def scale(numbers, min, max)
current_min = numbers.min
current_max = numbers.max
numbers.map {|n| min + (n - current_min) * (max - min) / (current_max - current_min)}
end
dataset = [1,30000,15000,200,3000]
result = scale(dataset, 0.1, 10.0)
=> [0.1, 10.0, 5.04983499449982, 0.165672189072969, 1.08970299009967]
scale(result, 1, 30000)
=> [1.0, 30000.000000000004, 15000.0, 199.99999999999997, 3000.0000000000005]
Wie Sie sehen können, müssen Sie sich bewusst der Rundung Probleme.Sie sollten wahrscheinlich auch sicherstellen, dass Sie nicht bekommen, Integer-zahlen, wie min und max, weil integer-division wird Schaden die Folge.
x = x / 3030.3031 + 0.1