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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top