我的数据集范围为1到30,000
我想将其标准化,使其变为0.1到10
这样做的最佳方法/功能是什么?
如果您能提供一些示例代码,我将不胜感激!
答案 0 :(得分:14)
这是一段代码片段,假设您需要线性规范化。这是一个非常简单的版本(只是直接的代码,没有方法),所以你可以看到它是如何工作的,并可以将它应用到任何东西。
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
确保我们不会陷入整数除法的黑洞)
答案 1 :(得分:8)
这里是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以外的最小值和最大值,以Elfstrom的答案方式向normalize!
添加参数。
答案 2 :(得分:7)
这是一种众所周知的缩放集合数字的方法。它有更精确的名称,但我记不起来,也没有谷歌。
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,因为整数除法会损坏结果。
答案 3 :(得分:-1)
x = x / 3030.3031 + 0.1