标准化后如何查看原始值?还是在最终输出中更改它们?
我想将最终输出更改回原始值。或者至少考虑到我汇总并取均值之后接近。
我有一个包含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
答案 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)