Pregunta

Tengo un conjunto de datos que varía de 1 a 30.000

Quiero normalizarla, por lo que se convierte en 0,1 a 10

¿Cuál es el mejor método / función de hacer eso?

agradecería mucho si pudiera dar algunos ejemplos de código!

¿Fue útil?

Solución

Esto es un fragmento de código, asumiendo que usted quiere un linear normalización. Es una versión muy simplista (solo código recta, no hay métodos), para que pueda ver "cómo funciona" y puede aplicarlo a cualquier 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) 

Y aquí se ha hecho como una función:

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: el to_f asegura no caer en el agujero negro de la división entera)

Otros consejos

Aquí está la Rubí camino para el caso común de fijar min de una matriz a 0,0 y máximo 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]

Para una min y max distinto de 0 y 1, añadir argumentos para normalize! en la forma de la respuesta de Elfstrom.

Esta es una manera bien conocida para escalar a números de colección. Tiene nombre más preciso, pero no puedo recordar y dejar de 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] 

Como se puede ver, hay que ser consciente de los problemas de redondeo. Probablemente debería también asegurarse de que usted no recibe enteros como mínimo y máximo, porque la división entera dañará el resultado.

x = x / 3030.3031 + 0.1

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top