Найти, какие значения были изменены после нормализации - PullRequest
1 голос
/ 01 июля 2019

Как я могу увидеть исходные значения после нормализации? Или поменять их в итоговом выводе?

Я хочу изменить свой окончательный вывод обратно на исходные значения. Или, по крайней мере, близко к этому, учитывая, что я агрегирую и беру среднее.

У меня есть набор данных, который имеет 10 столбцов и 5000 строк. После очистки данных и выбора нужных столбцов и строк я запускаю код нормализации.

Затем я запускаю kmeans и получаю вывод. Как я могу увидеть, что значения были изменены после нормализации? Например, если у меня есть области 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 голосов
/ 02 июля 2019

Это решение основано на базовой 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...