【问题标题】:How to revert back scalling of data in R?如何恢复 R 中数据的缩放比例?
【发布时间】:2014-08-12 17:07:40
【问题描述】:

我有一个数据集,其中包含如下数据:

       value
[1,] 41601325
[2,] 54917632
[3,] 64616616
[4,] 90791277
[5,] 35335221
[6,]    .
  .     .
  .     .

我不得不缩小到范围 [0,1] 使用

apply(data1, MARGIN = 2, FUN = function(X) (X - min(X))/diff(range(X)))

因为我需要将数据放入 GPfit 包的 GP_fit() 中。缩小后的值变成了:

       value
[1,] .4535
[2,] .56355
[3,] .64616
[4,] .70791
[5,] .35563
[6,]    .
  .     .
  .     .

在我对缩放数据应用GP_fit() 并使用predict() 并作为输出后,我得到了再次在范围[0,1] 内的新值,例如:

         value
    [1,] .0135
    [2,] .234355
    [3,] .6716
    [4,] .325079
    [5,] .95563
    [6,]    .
      .     .
      .     .

但我想将这些恢复到原始范围。我该怎么做?

基本上我想恢复/返回原始格式以显示predict()的输出

注意:原始范围不是固定的,可以变化,但通常可能的最大值约为 2000 万。

更新:我厌倦了实现@JustinFletcher 编写的代码。我的数据是:

    value
 [1,]  54.2
 [2,]  53.8
 [3,]  53.9
 [4,]  53.8
 [5,]  54.9
 [6,]  55.0
 [7,]  38.5
 [8,]  38.0
 [9,]  38.1
[10,]  38.0
[11,]  38.8
[12,]  38.9
[13,]  24.3
[14,]  24.1
[15,]  24.3
[16,]  24.1
[17,]  24.4
[18,]  24.4
[19,]  57.3
[20,]  57.2
[21,]  57.6
[22,]  57.7
[23,]  58.1
[24,]  57.9

我写这个是为了在 [0,1] 范围内重新调整它:

data_new <- apply(data_test, MARGIN = 2, FUN = function(X) (X - min(X))/diff(range(X)))

我得到了

           value
 [1,] 0.885294118
 [2,] 0.873529412
 [3,] 0.876470588
 [4,] 0.873529412
 [5,] 0.905882353
 [6,] 0.908823529
 [7,] 0.423529412
 [8,] 0.408823529
 [9,] 0.411764706
[10,] 0.408823529
[11,] 0.432352941
[12,] 0.435294118
[13,] 0.005882353
[14,] 0.000000000
[15,] 0.005882353
[16,] 0.000000000
[17,] 0.008823529
[18,] 0.008823529
[19,] 0.976470588
[20,] 0.973529412
[21,] 0.985294118
[22,] 0.988235294
[23,] 1.000000000
[24,] 0.994117647

然后为了恢复到原来的比例,我写了这个:

data_revert <- apply(data_new, MARGIN = 2, FUN = function(X, Y) (X + min(Y))*diff(range(Y)), Y=data_test)

我得到了

 value
 [1,] 849.5
 [2,] 849.1
 [3,] 849.2
 [4,] 849.1
 [5,] 850.2
 [6,] 850.3
 [7,] 833.8
 [8,] 833.3
 [9,] 833.4
[10,] 833.3
[11,] 834.1
[12,] 834.2
[13,] 819.6
[14,] 819.4
[15,] 819.6
[16,] 819.4
[17,] 819.7
[18,] 819.7
[19,] 852.6
[20,] 852.5
[21,] 852.9
[22,] 853.0
[23,] 853.4
[24,] 853.2

这个输出不正确。

【问题讨论】:

  • 操作顺序 - 缩减你正在做的 (A + B) * (C - D) 但它应该是 A * (C - D) + B
  • 恢复你所做的 data_revert
  • 应该是 data_revert
  • 仅基于以下 Roman 的回答 - 我没有查看 E2E 流程
  • @imsoconfused 得到了错误。感谢您的帮助!

标签: r scaling


【解决方案1】:

这是简单的代数。要缩放数据,您需要计算

n = (e - e_min)/(e_max - e_min)

现在你需要返回 e,基于任意的 e_mine_max。证明这一点是微不足道的

n(e_max - e_min) + e_min = e

例子:

e <- 1:10
n <- (e - min(e))/(max(e) - min(e))
new.e <- (n*(10-1)) + 1

> all(e == new.e)
[1] TRUE

【讨论】:

  • 抱歉,回复有点晚。我想我在上面的解释中不够清楚。我不想得到e,而是将不同的数字恢复到e的范围内。因此,对于您的示例,在您通过缩放 e 获得 n 之后,您通过对 n 的一些计算计算了另一个数字 n2,现在我想将这个 n2 带入 e 所在的范围内。
  • 我在上面的帖子中做了一些修改,但我得到的输出不正确。你能看看我上面帖子中的更新部分吗?
【解决方案2】:

您只需要将函数 FUN 的逆函数应用于输出数据。这需要将原始数据传递给函数。

apply(dataOutput, MARGIN = 2, FUN = function(X, Y) (X + min(Y))*diff(range(Y)), Y=data1)

有关“应用”功能的详细说明,请参阅here

P.S.:罗马人的反应是完全一样的想法,我只是用你的变量实现了它,使用apply,因为我觉得它很有趣。

【讨论】:

  • 我试图实现你的功能,但输出不正确。我已经修改了上面的代码供您查看。
  • 你提到的Function(X,Y)有错误。顺序不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多