无论您使用哪种取消缩放方法,您要做的第一件事就是保留您之前用于缩放数据的缩放因子。如果我没记错的话,这些来自训练数据中的所有列。比例因子的标准属性是每列的平均值和标准差。 scale() 函数将自动按列缩放数字矩阵或数据框。它将每列的平均值和标准差作为其属性中的比例因子。两列数据框的缩放过程示例如下。
data.1 <- data.frame(c1 = rnorm(10), c2 = rnorm(10, 5, 2))
数据是
(data.1)
## c1 c2
## 1 0.3772471 -0.009461602
## 2 0.4699993 6.437574717
## 3 0.7436121 2.491381059
## 4 -0.6511270 5.087134339
## 5 -1.0583016 6.618780052
## 6 1.4937440 6.102453550
## 7 0.3884317 4.856061369
## 8 0.4208206 5.548549865
## 9 -2.2471531 5.277538678
## 10 -0.2600908 7.497727819
缩放版本是
data.1.scaled <- scale(data.1)
(data.1.scaled)
## c1 c2
## [1,] 0.3860826 -2.26312966
## [2,] 0.4735246 0.65482868
## [3,] 0.7314726 -1.13123675
## [4,] -0.5834152 0.04361314
## [5,] -0.9672784 0.73684305
## [6,] 1.4386581 0.50315129
## [7,] 0.3966269 -0.06097155
## [8,] 0.4271614 0.25245193
## [9,] -2.0880661 0.12979102
## [10,] -0.2147666 1.13465886
## attr(,"scaled:center")
## c1 c2
## -0.03228177 4.99077398
## attr(,"scaled:scale")
## c1 c2
## 1.060729 2.209434
属性scaled:center 是每列的平均值,scaled:scale 是标准差。我们可以将这些属性用作其他数据的缩放因子。
data.2 <- data.frame(c1 = rnorm(5, 5, 2), c2 = rnorm(5, 10,3))
第二条数据:
(data.2)
## c1 c2
## 1 3.383793 9.790161
## 2 4.942863 8.953490
## 3 6.142607 9.301666
## 4 9.194484 8.823053
## 5 5.442842 7.044456
使用data.1缩放因子缩放的data.2:
data.2.scaled <- scale(data.2, center = attr(data.1.scaled, 'scaled:center'), scale = attr(data.1.scaled, 'scaled:scale'))
data.2 的缩放版本:
(data.2.scaled)
## c1 c2
## [1,] 3.220498 2.172225
## [2,] 4.690309 1.793544
## [3,] 5.821365 1.951129
## [4,] 8.698517 1.734507
## [5,] 5.161664 0.929506
## attr(,"scaled:center")
## c1 c2
## -0.03228177 4.99077398
## attr(,"scaled:scale")
## c1 c2
## 1.060729 2.209434
请注意,属性显示在与数据列长度相同的向量变量中。它还可以用于对缩放的数据进行缩放。我们可以使用apply() 和t() 函数来执行该过程。
到data.1:
data.1.unscaled <- t(apply(data.1.scaled, 1, function(input) {
(input * attr(data.1.scaled, 'scaled:scale')) +
attr(data.1.scaled, 'scaled:center')
}))
到data.2:
data.2.unscaled <- t(apply(data.2.scaled, 1, function(input) {
(input * attr(data.1.scaled, 'scaled:scale')) +
attr(data.1.scaled, 'scaled:center')
}))
现在让我们检查未缩放的数据和原始数据,它们必须相同。
cbind(data.1, data.1.unscaled)
## c1 c2 c1 c2
## 1 0.3772471 -0.009461602 0.3772471 -0.009461602
## 2 0.4699993 6.437574717 0.4699993 6.437574717
## 3 0.7436121 2.491381059 0.7436121 2.491381059
## 4 -0.6511270 5.087134339 -0.6511270 5.087134339
## 5 -1.0583016 6.618780052 -1.0583016 6.618780052
## 6 1.4937440 6.102453550 1.4937440 6.102453550
## 7 0.3884317 4.856061369 0.3884317 4.856061369
## 8 0.4208206 5.548549865 0.4208206 5.548549865
## 9 -2.2471531 5.277538678 -2.2471531 5.277538678
## 10 -0.2600908 7.497727819 -0.2600908 7.497727819
cbind(data.2, data.2.unscaled)
## c1 c2 c1 c2
## 1 3.383793 9.790161 3.383793 9.790161
## 2 4.942863 8.953490 4.942863 8.953490
## 3 6.142607 9.301666 6.142607 9.301666
## 4 9.194484 8.823053 9.194484 8.823053
## 5 5.442842 7.044456 5.442842 7.044456
如果您有一个缩放值(我从两个数据框的第 2 列采样)并希望使用某个缩放因子(例如第 2 列)对其进行未缩放,
set.seed(1)
one.column.scaled <- data.frame(x = sample(c(data.1.scaled[,2], data.2.scaled[,2]), 5))
(one.column.scaled)
## x
## 1 0.12979102
## 2 0.04361314
## 3 -0.06097155
## 4 -2.26312966
## 5 0.65482868
那么您可以在不调用apply() 和t() 函数的情况下执行缩放过程。
one.column.unscaled <- (one.column.scaled * attr(data.1.scaled, 'scaled:scale')[2]) +
attr(data.1.scaled, 'scaled:center')[2]
(one.column.unscaled)
## x
## 1 5.277538678
## 2 5.087134339
## 3 4.856061369
## 4 -0.009461602
## 5 6.437574717