La normalización conjunto de datos con el rubí
-
19-09-2019 - |
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!
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