12

我有一个范围从 1 到 30,000 的数据集

我想对其进行归一化,使其变为 0.1 到 10

最好的方法/功能是什么?

如果您能提供一些示例代码,将不胜感激!

4

4 回答 4

15

这是一个代码片段,假设您需要线性归一化。这是一个非常简单的版本(只是直接的代码,没有方法),所以你可以看到“它是如何工作的”并且可以将它应用到任何东西上。

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确保我们不会陷入整数除法的黑洞)

于 2009-10-02T08:53:29.507 回答
8

这是一种广为人知的方式来缩放集合数量。它有更准确的名称,但我不记得了,也没有在谷歌上搜索它。

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,因为整数除法会损坏结果。

于 2009-10-02T09:13:45.747 回答
8

这是将数组的最小值设置为 0.0 并将最大值设置为 1.0 的常见情况的 Ruby 方式。

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!以 Elfstrom 的回答方式添加参数。

于 2014-07-25T15:56:16.553 回答
-2

x = x / 3030.3031 + 0.1

于 2009-10-02T06:56:57.500 回答