Este
es una forma bien conocida de escalar los números de una colección. Tiene un nombre más preciso, pero no puedo recordarlo y no puedo buscarlo en 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 puede ver, debe tener en cuenta los problemas de redondeo. También debería asegurarse de no obtener enteros como mínimo & máximo porque la división entera dañará el resultado.
¿Está seguro de que esto se llama normalización de datos? Puede considerar llamar a esta transformación de datos, creo que la normalización se refiere a la topología de los datos. – jrhicks