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


265

我迷失了正常化,任何人都可以指导我。

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

如果我得到5.6878的值,如何将该值以0到1的比例缩放。


8
这是=(value-min)/(max-min)的方式
Angelo

3
它可能会帮助您阅读以下主题:如何验证分配是否标准化。如果这样可以回答您的问题,则可以删除此问题;如果不是,请编辑您的Q以指定您仍然不了解的内容。
gung

1
保护说明:这个问题吸引了仅包含代码解决方案的额外答案。尽管这些对于某些读者可能很有趣或很有用,但是CV并不是提供代码解决方案的存储库。
尼克·考克斯

1
提供的解决方案考虑了线性对比度值-您是否要进行不同的归一化,例如获得统一概率的输出?
meduz '18

Answers:


299

如果要标准化数据,可以按照建议进行操作,只需计算以下内容:

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

其中和现在是您的规范化数据。作为概念验证(尽管您没有要求),下面是一些代码和随附的图来说明这一点:x=(x1,...,xn)ziithR

在此处输入图片说明

# 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="")

11
我只想知道illustrate the point您(正确)答案的两个看上去截然不同的直方图如何?
ttnphns 2013年

12
@ttnphns由于直方图的合并,它们看起来仅有所不同。但是,我的观点是要表明原始值的范围是-100到100,现在归一化之后它们的范围是0到1。我本可以使用其他图形来说明这一点,或者只是汇总统计信息。

20
@ttnphns的轻推是为了鼓励您不仅使用简单的方法来说明(简单的)想法,而且(我怀疑)是暗示在此使用更直接相关的说明可能会有所帮助。您可以通过找到一种更简单的方法来绘制变换(当将变换应用于OP实际提供的最小值和最大值时)来完成这两项工作
笨蛋

1
有没有一种方法可以“标准化”自定义范围而不是0-1?
约翰·德米特里

1
@JohnDemetriou可能不是最干净的解决方案,但是您可以缩放归一化的值来做到这一点。例如,如果您想要范围为0-100,则只需将每个数字乘以100。如果您想要的范围不是以0开头(例如10-100),则可以通过按MAX-MIN进行缩放,然后缩放为只需加上MIN就可以从中获得值。因此将其缩放90,然后添加10。对于您可能想要的大多数自定义范围来说,这应该足够了。
亚历山大·罗萨

47

将观察到的最小值最大值线性调整为新的任意范围min'max'的通用一线公式为

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

9
这是正确的,但效率不高。这是一个线性变换,因此您需要预先计算ab常数,然后再应用newvalue = a * value + ba = (max'-min')/(max-min)b = max - a * max
Mark Lakata 2013年

1
你知道如何引用吗?我的意思是,某处是否有“原始”参考?
Trefex 2014年

3
@MarkLakata Slight(typo?)更正:b = max' - a * maxb = min' - (a * min)
Nick

@尼克-是的。我想念一个
马克·拉卡塔

您可以在这里se.mathworks.com/matlabcentral/answers/…比较方程式u = -1 + 2.*(u - min(u))./(max(u) - min(u));
莱奥波德·赫兹(LéoLéopoldHertz)

13

这是我用于规范化的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


2
此答案与已接受的答案之间存在重要区别。这清楚,直接地解释了主要思想,然后其次展示了如何在一个常用程序中做到这一点。相反,您仅在此处发布代码。尽管我很高兴在此论坛上认为这是不错的代码(我不写PHP),但对于每个问题,通常都没有一堆答案来解释如何使用每种可能的语言来实现。否则,我们将在SAS,SPSS,Stata,MATLAB,C,C ++,C#,Java中得到答案。Python等,等等
Nick Cox 2015年

2
我不认为这是唯一的区别。在我的代码中,我还展示了如何将归一化的值返回到归一化之前的值。我认为,这值得这个答案。
jankal 2015年

1
仍然只发布代码是正确的:我认为您需要在注释中强调代码的任何所谓特殊之处,否则读者必须阅读代码以查看其含义。假定仅当(a)原始值已被覆盖,但(b)用户谨慎记住要保存最小值和最大值时,才可以使用缩放比例反转。如上所述,我的更广泛的观点是CV并非旨在成为代码示例的存储库。
尼克·考克斯

存在一些问题,需要恢复该值:例如,Nueral Networks ...但是您是对的,以数据分析的方式,这个答案非常糟糕。
jankal,2015年

3
@NickCox我发现他的回答比被接受的回答更令人满意。
莫里森

4

被零除

要记住的一件事是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]

这是重新缩放为总和1,而不是范围0-1。因此,我只是认为答案是题外话。
ttnphns

不是这样 normalize([12, 20, 10])输出[0.2, 1.0, 0.0],这与您将获得的输出相同(val - min) / (max - min)
rodrigo-silveira

@ rodrigo-silveira我不明白为什么所有0.25的输出。全部不是0.5更好吗?所有项目均相等,因此应保持在间隔的中心。
javierdvalle

0

答案是正确的,但我有一个建议,如果您的训练数据遇到超出范围的数字怎么办?您可以使用挤压技术。它将保证永远不会超出范围。而不是这个

在此处输入图片说明

我建议使用这个

在此处输入图片说明

像这样在最小和最大范围内挤压

在此处输入图片说明

并且预期的超出范围的间隙的大小与存在超出范围的值的置信度成正比。

欲了解更多信息,您可以谷歌:挤压超出范围的数字,并参考“ dorian pyle”的数据准备书


5
请编辑您的答案以使用大写字母。一致的小写字母可能看起来很有趣或有效,但是几乎每个人都很难阅读。
尼克·考克斯

3
插图无法充分传达您的答案。什么是“压榨技术”?
ub

0

尝试这个。与功能量表一致

normalize <- function(x) { 
  x <- as.matrix(x)
  minAttr=apply(x, 2, min)
  maxAttr=apply(x, 2, max)
  x <- sweep(x, 2, minAttr, FUN="-") 
  x=sweep(x, 2,  maxAttr-minAttr, "/") 
  attr(x, 'normalized:min') = minAttr
  attr(x, 'normalized:max') = maxAttr
  return (x)
} 

7
此答案与已接受的答案之间存在重要区别。这清楚,直接地解释了主要思想,然后其次展示了如何在一个常用程序中做到这一点。相反,您仅在此处发布代码。尽管我很高兴在此论坛上相信这是不错的代码(使用某些无法解释的语言),但对于每个问题,我们通常都没有一堆答案来解释如何使用每种可能的语言来实现。否则,我们将在SAS,SPSS,Stata,MATLAB,C,C ++,C#,Java中得到答案。Python等)
Nick Cox 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.