【问题标题】:Normalising data to [-1 and 1] , but 0 value needs to be preserved将数据标准化为 [-1 and 1] ,但需要保留 0 值
【发布时间】:2021-03-18 18:01:09
【问题描述】:

我有一个 r=data 的范围,它既是正的又是负的。我想将其标准化为 [-1,1] 范围。

我用过 apply(lambda x: -1 + (2*((x - x.min()) / (x.max() - x.min())))) 它将数据从 -1 标准化为 1,但在我的数据中 0 很重要,因此我希望需要保留它。

我怎样才能完成它?

【问题讨论】:

  • 这听起来像你真的有一个数学问题而不是一个编程问题。问题是设计规则告诉你给定输入的结果值应该是什么,而不是实现它。
  • 可以分别归一化 [x.min, 0] 和 [0, xmax] (当 xmin

标签: python normalization


【解决方案1】:

使用 numpy 你可以做到这一点

输入:

r =(-5,-10,0,1,17)

import numpy as np
normalized = np.where(r>0,r/r.max(),np.where(r<0,-r/r.min(),r))

输出:

normalized = (-0.5 ,-1 ,0 ,0.0588235,1 )

我认为你期待这样的结果

【讨论】:

  • 谢谢!是的,这正是我想要做的。
  • 我在不同的列中有数据。如何将 np.apply 与此规则一起使用,以便它单独应用于所有列?
  • 你能分享一下列的结构吗?我认为你需要对不同的列做同样的思考,否则你的数据结构是(1,M)结构。
  • 这是我之前做的标准化 = data[['A', 'B', 'C']].apply(lambda x: -1 + (2*((x - x .min()) / (x.max() - x.min()))))。所有的颜色都被这条规则标准化了。但是,当我做 normalized = data[['A', 'B', 'C']].apply(np.where(data>0,data/data.max(),np.where(data
  • 我有 1987 行的三列。
【解决方案2】:

您正在做的是获取您的 minmax 并假设这是您工作的范围。然后你压缩所有值并移动它们,使它们适合 [-1, 1] 范围。

问题是:当极值与 0 的距离不同时,您将不得不移动,这将移动所有零。这在数学上是正确的,因为它保留了分布。

比如说,序列[-1, 0, 2] 的极值是-12。操作后变为[-1, -0.66, 1]

要解决这个问题,您必须假设您工作的范围与两边的零距离相等。所以这将是你的最大极值。在上面的例子中是2。现在,如果您假设您在[-2, 2] 范围内工作,您的序列将变为[-0.5, 0, 1]

这很容易通过将所有项目除以最大极值来实现。

def normalize(seq):
    extremum = max(abs(i) for i in seq)
    return [i / extremum for i in seq]

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 2018-07-25
    • 2019-08-12
    • 1970-01-01
    • 2012-05-09
    • 2017-03-14
    • 2020-12-23
    • 2018-09-30
    相关资源
    最近更新 更多