dataset Normalizzazione con rubino
-
19-09-2019 - |
Domanda
Ho un insieme di dati che va da 1 a 30.000
Voglio di normalizzare esso, in modo che diventi 0,1 a 10
Qual è il miglior metodo / funzione per fare questo?
saremmo grati se potesse dare alcuni esempi di codice!
Soluzione
Ecco un frammento di codice, supponendo che si desidera un linear normalizzazione. Si tratta di una versione molto semplicistica (solo codice di diritto, nessun metodo), in modo da poter vedere "come funziona" e può applicarla a qualsiasi cosa.
xmin = 1.0
xmax = 30000.0
ymin = 0.1
ymax = 10.0
xrange = xmax-xmin
yrange = ymax-ymin
y = ymin + (x-xmin) * (yrange / xrange)
E qui è fatto in funzione:
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)
(Nota: il to_f
assicura che non cadiamo nel buco nero della divisione intera)
Altri suggerimenti
Ecco il modo di Ruby per il caso comune di impostazione min di un array per 0,0 e massimo a 1,0.
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]
Per un minimo e massimo diverso da 0 e 1, aggiungere argomenti al normalize!
alla maniera di risposta di Elfstrom.
Questo è un modo ben noto per scalare un numero di raccolta. Essa ha il nome più preciso, ma non riesco a ricordare e non riescono a google.
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]
Come si può vedere, si deve essere consapevoli di arrotondamento problemi. Probabilmente si dovrebbe anche fare in modo che non si ottiene interi come min e max perché divisione intera danneggia il risultato.
x = x / 3030.3031 + 0.1