2009-10-02 13 views
10

Tengo un conjunto de datos que varía de 1 a 30.000conjunto de datos La normalización con el rubí

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

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

¡Lo agradecería mucho si pudiera darnos un código de muestra!

+0

¿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

Respuesta

14

He aquí un fragmento de código, asumiendo que usted quiere un lineal normalización. Es una versión muy simplista (solo código directo, sin métodos), por lo que puede 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)

+1

Gracias brent! esa es una manera agradable y elegante de hacer esto =) –

6
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.

7

Aquí está la manera Ruby para el caso común de establecer un mínimo de la 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.

Cuestiones relacionadas