dataset normalizando com rubi
-
19-09-2019 - |
Pergunta
Eu tenho um conjunto de dados que varia de 1 a 30.000
Eu quero normalizá-lo, para que se torne 0,1 a 10
O que é o melhor método / função para fazer isso?
agradeceria muito se você pudesse dar um código de exemplo!
Solução
Aqui está um trecho de código, supondo que você quer um linear normalização. É uma versão muito simplista (apenas código em linha reta, nenhum método), assim você pode ver "como funciona" e pode aplicá-la a nada.
xmin = 1.0
xmax = 30000.0
ymin = 0.1
ymax = 10.0
xrange = xmax-xmin
yrange = ymax-ymin
y = ymin + (x-xmin) * (yrange / xrange)
E aqui é feito como uma função:
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: os garante to_f
não cair no buraco negro da divisão inteira)
Outras dicas
Aqui está o Caminho Ruby para o caso comum de ajuste min de uma matriz para 0,0 e máximo de 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 um mínimo e máximo diferente de 0 e 1, adicionar argumentos para normalize!
na forma da resposta de Elfstrom.
Esta é uma maneira bem conhecida para dimensionar um número de cobrança. Tem nome mais preciso, mas não me lembro e não google-lo.
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 você pode ver, você tem que estar ciente de arredondamento problemas. Você provavelmente deve também certificar-se de que você não ficar inteiros como min e max, porque a divisão inteira vai prejudicar o resultado.
x = x / 3030.3031 + 0.1