2016-09-06 171 views
-1

我使用这些R脚本通过Min Max标准化数据。R反规范化数据

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

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

我怎样才能使数据非标准化?

谢谢!

+4

那么这里期望的输出是什么?为什么不把“标准化”版本保存到不同的变量中。使用此公式无法唯一地对数据进行非正常化。 'c(0,10)'将被标准化为'c(0,1)',但'c(3,17)'也会被标准化。不可能说出原始值是什么。 – MrFlick

+0

原始数据例如是[(3,8,10,11,22,28),(4,17,20,21,26,40),(4,5,13,​​16,18,27)] – myID33

+2

您应该修改帖子以包含重要信息(如示例数据),而不是将其留在评论中。 – Frank

回答

3

本质上,你只需要反转算术: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功能...)