我有范围从1至30000的数据集

欲正常化它,使之成为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之道用于阵列的min至0.0和最大值设置为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中的最小和最大其他,添加参数在Elfstrom的回答的方式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