2017-05-18 6 views
0

私は、トレーニングセットとテストセットを引数としてとり、min-maxスケール/正規化してトレーニングセットを返し、 同じ最小値と最小〜最小スケールの範囲の値/正規化し、テストセットを返します。電車とテストデータのrの最大スケーリング/正規化

今のところ、これは私が出ている機能である:

min_max_scaling <- function(train, test){ 

    min_vals <- sapply(train, min) 
    range1 <- sapply(train, function(x) diff(range(x))) 

    # scale the training data 

    train_scaled <- data.frame(matrix(nrow = nrow(train), ncol = ncol(train))) 

    for(i in seq_len(ncol(train))){ 
    column <- (train[,i] - min_vals[i])/range1[i] 
    train_scaled[i] <- column 
    } 

    colnames(train_scaled) <- colnames(train) 

    # scale the testing data using the min and range of the train data 

    test_scaled <- data.frame(matrix(nrow = nrow(test), ncol = ncol(test))) 

    for(i in seq_len(ncol(test))){ 
    column <- (test[,i] - min_vals[i])/range1[i] 
    test_scaled[i] <- column 
    } 

    colnames(test_scaled) <- colnames(test) 

    return(list(train = train_scaled, test = test_scaled)) 
} 

最小最大スケーリングの定義がSOに早く尋ね、この質問に似ている - Normalisation of a two column data using min and max values

私の質問は以下のとおりです。
1.関数内の2つのループをベクトル化する方法はありますか?例えば使用するsapply()
2.ここでやろうとしていることを実行できるパッケージがありますか?

答えて

3

あなたの第二の問題について、あなたはcaretパッケージを使用することができます

library(caret) 

train = data.frame(a = 1:3, b = 10:12) 
test = data.frame(a = 1:6, b = 7:12) 

pp = preProcess(train, method = "range") 


predict(pp, train) 

#  a b 
# 1 0.0 0.0 
# 2 0.5 0.5 
# 3 1.0 1.0 

predict(pp, test) 

#  a b 
# 1 0.0 -1.5 
# 2 0.5 -1.0 
# 3 1.0 -0.5 
# 4 1.5 0.0 
# 5 2.0 0.5 
# 6 2.5 1.0 

このパッケージを、他の変換方法を定義し、以下を参照してください。http://machinelearningmastery.com/pre-process-your-dataset-in-r/

0
set.seed(1984) 

### simulating a data set 

df <- data.frame(var1 = rnorm(100,5,3), 
       var2 = rpois(100,15), 
       var3 = runif(50,90,100)) 

df_train <- df[1:60,] 
df_test <- df[61:100,] 



## the function 

normalize_data <- function(train_set, test_set) ## the args are the two sets 

{ 
    ranges <- sapply(train_set, function(x) max(x)-min(x)) ## range calculation 

    normalized_train <- train_set/ranges # the normalization 
    normalized_test <- test_set/ranges 

    return(list(ranges = ranges,     # returning a list 
       normalized_train= normalized_train, 
       normalized_test =normalized_test)) 
    } 


z <- normalize_data(df_train, df_test) ## applying the function 

    ## the results 
    z$ranges 
     var1  var2  var3 
    13.051448 22.000000 9.945934 
    > head(z$normalized_train) 
      var1  var2  var3 
    1 0.47715854 1.1492978 7.289028 
    2 0.18322387 0.4545455 4.280883 
    3 0.69451066 1.3070668 9.703761 
    4 -0.04125108 1.6090169 7.277882 
    5 0.35731555 0.7272727 4.133561 
    6 0.86120315 0.6032616 9.246209 
    > head(z$normalized_train) 
      var1  var2  var3 
    1 0.47715854 1.1492978 7.289028 
    2 0.18322387 0.4545455 4.280883 
    3 0.69451066 1.3070668 9.703761 
    4 -0.04125108 1.6090169 7.277882 
    5 0.35731555 0.7272727 4.133561 
    6 0.86120315 0.6032616 9.246209 
+0

が答えへの試みをありがとう私は、すべての行からその列の最小値を引いて、その範囲で除算することによって、データを基準にスケールする方法を検討しています。あなたの答えは最小の減算を考慮に入れません。 –

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

as.data.frame(lapply(df$name, normalize)) 

min-max normalization try this may work 
関連する問題