如何将数据标准化为 0-1 范围?

机器算法验证 正常化
2022-01-15 10:27:43

我迷失在正常化中,谁能指导我。

我有一个最小值和最大值,分别是 -23.89 和 7.54990767。

如果我得到一个 5.6878 的值,我如何在 0 到 1 的范围内缩放这个值。

4个回答

如果您想标准化您的数据,您可以按照您的建议进行操作,并简单地计算以下内容:

zi=ximin(x)max(x)min(x)

其中x=(x1,...,xn)zi现在是您的ith标准化数据。作为概念证明(尽管您没有要求),这里有一些R代码和随附的图表来说明这一点:

在此处输入图像描述

# Example Data
x = sample(-100:100, 50)

#Normalized Data
normalized = (x-min(x))/(max(x)-min(x))

# Histogram of example data and normalized data
par(mfrow=c(1,2))
hist(x,          breaks=10, xlab="Data",            col="lightblue", main="")
hist(normalized, breaks=10, xlab="Normalized Data", col="lightblue", main="")

将观察到的minmax的数据值线性重新缩放到新的任意范围min'max'的一般单行公式

  newvalue= (max'-min')/(max-min)*(value-max)+max'
  or
  newvalue= (max'-min')/(max-min)*(value-min)+min'.

这是我的规范化 PHP 实现:

function normalize($value, $min, $max) {
	$normalized = ($value - $min) / ($max - $min);
	return $normalized;
}

但是,当我在构建自己的人工神经网络时,我需要将归一化的输出转换回原始数据,以获得图形的良好可读输出。

function denormalize($normalized, $min, $max) {
	$denormalized = ($normalized * ($max - $min) + $min);
	return $denormalized;
}

$int = 12;
$max = 20;
$min = 10;

$normalized = normalize($int, $min, $max); // 0.2
$denormalized = denormalize($normalized, $min, $max); //12

非规范化使用以下公式:

x(maxmin)+min

被零除

要记住的一件事是它max - min可能等于零。在这种情况下,您不希望执行该除法。

发生这种情况的情况是当您尝试规范化的列表中的所有值都相同时。为了规范化这样一个列表,每个项目都是1 / length.

// JavaScript
function normalize(list) {
   var minMax = list.reduce((acc, value) => {
      if (value < acc.min) {
         acc.min = value;
      }

      if (value > acc.max) {
         acc.max = value;
      }

      return acc;
   }, {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY});

   return list.map(value => {
      // Verify that you're not about to divide by zero
      if (minMax.max === minMax.min) {
         return 1 / list.length
      }

      var diff = minMax.max - minMax.min;
      return (value - minMax.min) / diff;
   });
}

例子:

normalize([3, 3, 3, 3]); // output => [0.25, 0.25, 0.25, 0.25]