查找标准化后将值更改为什么

时间:2019-07-01 20:18:33

标签: r

标准化后如何查看原始值?还是在最终输出中更改它们?

我想将最终输出更改回原始值。或者至少考虑到我汇总并取均值之后接近。

我有一个包含10列和5,000行的数据集。清理数据并选择所需的列和行后,我运行规范化代码。

然后我运行kmeans并获得输出。标准化后如何查看将值更改为什么?就像,如果我有Region 1、2、3、4和5,并且在归一化后将其更改为0.00、0.25、0.5、0.75和1。是否有办法将它们更改为kmeans输出中的原始位置?

我想将最终输出更改回原始值。或者至少考虑到我汇总并取均值之后接近。

       normalize = function(X) {
                 return(abs((X-min(X)))/(max(X)-min(X)))
                 }

       df_age_norm = as.data.frame(lapply(df_age,normalize))

       clusters = kmeans(df_age_norm, 9)[['cluster']]

       df_age_norm$clusters = clusters

       df_age_norm =  
              aggregate(df_age_norm[,1:4],list(df_age_norm$clusters),FUN 
                = mean)

我想将最终输出更改回原始值。或者至少考虑到我汇总并取均值之后接近。

归一化之前的数据集的头

Age  HHIncome Region MaritalStatus group
18    11000      5             0     1
18    11000      5             1     1
18    12000      2             0     1
18    12000      4             0     1
18    13000      1             0     1

归一化后的数据集头

Age    HHIncome Region MaritalStatus group    
0 0.001879699   1.00             0     0    
0 0.001879699   1.00             1     0    
0 0.002819549   0.25             0     0    
0 0.002819549   0.75             0     0    
0 0.003759398   0.00             0     0

1 个答案:

答案 0 :(得分:0)

此解决方案的灵感来自基数R函数scale,该函数通过减去平均值并除以向量x的标准偏差来对向量进行居中和缩放。 mean(x)sd(x)这两个值将作为attributes返回。

x <- -4:5
y <- scale(x)
attributes(y)
#$dim
#[1] 10  1
#
#$`scaled:center`
#[1] 0.5
#
#$`scaled:scale`
#[1] 3.02765

因此,我具有重写的功能normalize,也可以设置并返回min(x)max(x)作为属性。它们将用于以后进行反规范化。

normalize <- function(X, na.rm = FALSE) {
  if(na.rm) X <- X[!is.na(X)]
  Min <- min(X)
  Max <- max(X)
  Y <- X - Min
  if(Min != Max) Y <- Y/(Max - Min)
  attr(Y, "scaled:min") <- Min
  attr(Y, "scaled:max") <- Max
  Y
}

denormalize <- function(X){
  Min <- attr(X, "scaled:min")
  Max <- attr(X, "scaled:max")
  attr(X, "scaled:min") <- NULL
  attr(X, "scaled:max") <- NULL
  Y <- if(Min != Max) X*(Max - Min) else X
  Y <- Y + Min
  Y
}


df_age_norm <- as.data.frame(lapply(df_age, normalize))

df_age_2 <- as.data.frame(lapply(df_age_norm, denormalize))

df_age_2 
#  Age HHIncome Region MaritalStatus group
#1  18    11000      5             0     1
#2  18    11000      5             1     1
#3  18    12000      2             0     1
#4  18    12000      4             0     1
#5  18    13000      1             0     1

数据。

df_age <- read.table(text = "
Age  HHIncome Region MaritalStatus group
18    11000      5             0     1
18    11000      5             1     1
18    12000      2             0     1
18    12000      4             0     1
18    13000      1             0     1
", header = TRUE)