У меня есть набор данных от 1 до 30 000
Я хочу нормализовать его, чтобы он стал от 0,1 до 10
Каков наилучший метод/функция для этого?
Был бы очень признателен, если бы вы могли дать примерный код!
У меня есть набор данных от 1 до 30 000
Я хочу нормализовать его, чтобы он стал от 0,1 до 10
Каков наилучший метод/функция для этого?
Был бы очень признателен, если бы вы могли дать примерный код!
Вот фрагмент кода, предполагающий, что вам нужна линейная нормализация. Это очень упрощенная версия (просто прямой код, без методов), поэтому вы можете увидеть, как это работает, и можете применить его ко всему.
xmin = 1.0
xmax = 30000.0
ymin = 0.1
ymax = 10.0
xrange = xmax-xmin
yrange = ymax-ymin
y = ymin + (x-xmin) * (yrange / xrange)
И здесь это делается как функция:
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)
(Примечание: to_f
гарантирует, что мы не попадаем в черную дыру целочисленного деления)
Здесь Ruby Way для обычного случая установки массива min до 0.0 и max до 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]
Для min и max, отличных от 0 и 1, добавьте аргументы в normalize!
в ответе Elfstrom.
Это хорошо известный способ масштабирования номеров коллекций. Он имеет более точное имя, но я не могу вспомнить и не смог его найти.
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]
Как вы можете видеть, вы должны знать о проблемах округления. Вероятно, вы также должны убедиться, что не получаете целых чисел как min и max, потому что целочисленное деление может повредить результат.
x = x / 3030.3031 + 0.1