Нормализация набора данных с помощью Ruby

StackOverflow https://stackoverflow.com/questions/1507804

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть набор данных в диапазоне от 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]

Для минимального и максимального значений, отличных от 0 и 1, добавьте аргументы в normalize! в манере ответа Эльфстрема.

Это хорошо известный способ масштабирования чисел коллекции.У него есть более точное название, но я не могу его вспомнить и не могу его найти в 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] 

Как видите, вам нужно знать о проблемах округления.Вероятно, вам также следует убедиться, что вы не получаете целые числа как минимум и максимум, потому что целочисленное деление повредит результат.

x = x / 3030.3031 + 0.1

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top