Cette est un moyen bien connu pour mettre à l'échelle un nombre de collection. Il a un nom plus précis, mais je ne peux pas me souvenir et ne pas le 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]
Comme vous pouvez le voir, vous devez être conscient des problèmes d'arrondi. Vous devriez également vous assurer que vous n'obtenez pas d'entiers au minimum & car la division entière endommagera le résultat.
Etes-vous sûr que cela s'appelle la normalisation des données? Vous pouvez envisager d'appeler cette transformation de données, je crois que la normalisation se réfère à la topologie des données. – jrhicks