数据去规范化

7

我使用以下R代码将数据进行最小值和最大值标准化:

normalize <- function(x) {
    return ((x - min(x)) / (max(x) - min(x)))
  }

mydata <- as.data.frame(lapply(mydata , normalize))

如何对数据进行反规范化?

5
这里的期望输出是什么?为什么不将“标准化”版本保存到另一个变量中?使用这个公式无法唯一地将数据还原。 c(0,10) 将被标准化为 c(0,1),但 c(3,17) 也会被标准化为相同的值。因此不能确定原始值是什么。 - MrFlick
原始数据示例为 [(3,8,10,11,22,28), (4,17,20,21,26,40), (4,5,13,16,18,27)]。 - myID33
2
你应该编辑你的帖子,包括重要信息(例如示例数据),而不是留在评论中。 - Frank
1个回答

16

本质上,你只需要颠倒算术运算:x1 = (x0-min)/(max-min) 意味着 x0 = x1*(max-min) + min。但是,如果你正在覆盖你的数据,最好在归一化之前存储最小值和最大值,否则(如@MrFlick在评论中指出的那样),你就会完蛋了。

设置数据:

dd <- data.frame(x=1:5,y=6:10)

规范化:

normalize <- function(x) {
    return ((x - min(x)) / (max(x) - min(x)))
}
ddnorm <- as.data.frame(lapply(dd,normalize))
##      x    y
## 1 0.00 0.00
## 2 0.25 0.25
## 3 0.50 0.50
## 4 0.75 0.75
## 5 1.00 1.00

去规范化:

minvec <- sapply(dd,min)
maxvec <- sapply(dd,max)
denormalize <- function(x,minval,maxval) {
    x*(maxval-minval) + minval
}
as.data.frame(Map(denormalize,ddnorm,minvec,maxvec))
##   x  y
## 1 1  6
## 2 2  7
## 3 3  8
## 4 4  9
## 5 5 10

一个更聪明的normalize函数会将缩放变量作为属性附加到结果上(参见?scale函数...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接