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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top