【问题标题】:R Scale a vector with negative and positive numbers between 1 and -1R用1到-1之间的负数和正数缩放向量
【发布时间】:2021-03-06 19:50:45
【问题描述】:

我有一个向量如下

vec <- c(0, -0.072, -0.092, -0.092, -0.222, -0.445, -0.345, -0.031, 
0.016, 0.158, 0.349, 0.749, 1.182, 1.289, 1.578, 1.767, 1.621, 
1.666, 1.892, 1.866, 1.821, 1.702, 1.69, 1.53, 1.38, 1.494, 1.833, 
2.392, 2.502, 2.921, 3.363, 3.698, 3.645, 3.89, 3.987, 4.066, 
3.963, 3.749, 3.512, 3.259, 3.153, 2.972, 2.918, 2.93, 2.719, 
2.458, 2.275, 2.346, 2.588, 2.774, 2.607, 2.336, 1.799, 1.365, 
1.025, 0.379, -0.087, -0.765, -1.19, -1.423, -1.751, -1.965, 
-1.907, -1.919, -1.848, -1.772, -1.49, -1.19, -1.104, -1.138, 
-1.054, -1.139, -1.269, -1.429, -1.56, -1.543, -1.364, -1.318, 
-1.094, -1.061, -0.918, -0.861, -0.913, -0.767, -0.615, -0.532, 
-0.615, -0.688, -0.75, -0.724, -0.755, -0.685, -0.752, -0.863, 
-0.944, -1.004, -1.02, -1.041, -1.073, -1.392)

以下代码在 1 和 -1 之间完美缩放此向量。

scale <- function(input)
{
  min_val = min(input, na.rm = T)
  max_val = max(input, na.rm = T)
  
  average = (min_val + max_val) / 2
  range = (max_val - min_val) / 2
  normalized_x = (input - average) / range
  return(normalized_x)
}

但是,我想将此向量从 -1 缩放到 1,同时保持中点为 0。

有人可以改进上述函数以使这个缩放以 0 为中心吗?

谢谢!

【问题讨论】:

    标签: r scale


    【解决方案1】:

    将此操作称为“规范化”是相当令人困惑的。正确的术语是缩放。归一化意味着您已将值转换为类似于正态分布的东西。 (有一个名为scale的R函数,)

    这会将低于 0 的值缩放到范围 [-1, 0),并将高于 0 的值缩放到范围 (0,1],这是我理解的愿望:

    c( -vec[vec<0]/min(vec), vec[vec>=0]/max(vec) )
    

    但是,它们不是按原始顺序排列的。如果需要,您可能需要执行 ifelse 操作:

     newvec <- ifelse(vec < 0 , -vec[vec<0]/min(vec), vec[vec>=0]/max(vec)  )
      #-------------
     > sum(newvec<0)
    [1] 51
    > sum(newvec>0)
    [1] 47
    > sum(newvec==0)
    [1] 2
    

    【讨论】:

    • Normalization means you have transformed the values to something resembling a Normal distribution - 见en.wikipedia.org/wiki/Normalization_(statistics)
    • 请注意,这些示例大多是我所说的(转换为正常,并且请求的特定类型的转换给出了更具描述性和准确的名称“min-max scaling “。请注意,我说它“令人困惑”。我想我可以说“模棱两可”而不是“令人困惑”,我想我可以说“规范化应该意思是……”但是……我没有。而且我不会。
    • 感谢您的回答!我更新了问题,将函数称为缩放而不是标准化。
    • 以下对我来说效果最好 - newvec = ifelse(vec &lt; 0 , -vec/min(vec, na.rm = T), vec/max(vec, na.rm = T))。再次感谢!
    • 如果您的“真正问题”中有 NA,那么最好将其放入您的测试用例中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多