sklearn 中的规范化及其差异

Normalizations in sklearn and their differences

我看了很多文章建议这个公式

N = (x - min(x))/(max(x)-min(x))

标准化

但是当我在某个地方深入研究 sklearn 的规范化器时,我发现他们正在使用这个公式

x / np.linalg.norm(x)

后面默认使用l2-norm。我应该使用哪一个?为什么两者有区别?

np.ling.norm 由以下公式给出:

np.linalg.norm(x) = sqrt((sum_i_j(abs(x_i_j)))^2)

所以假设您有:

X= (1  2
    0  -1)

那么你将拥有:

np.linalg.norm(x)= sqr((1+2+0+1)^2)= sqr(16)=4
X = (0.25 0.5
     0    -0.25)

如果使用另一种方法,您将拥有:

min(x)= -1
max(x)= 2
max(x)-min(x)=3
X = (0.66 1
     0.33 0)

所以 min(x)/max(x) 也被称为 MinMaxScaler,所有的值总是在 0-1 之间,其他方法标准化你的值,但你仍然可以有负值。根据您的后续步骤,您需要决定使用哪一个。

Based on the API description

Scikit-learn 规范器将输入向量单独缩放为单位范数(向量长度)。

这就是它使用 L2 正则化器的原因(您也可以使用 L1,如 API 中所述)

根据您的描述,我认为您正在寻找定标器而不是标准化器。请在此 link.

中找到 Min-Max 缩放器

此外,您可以考虑一个 standard scaler,它通过移除均值并缩放到标准差来标准化值。

有不同的归一化技术,sklearn 提供了其中的许多技术。请注意,我们在这里查看的是一维数组。对于矩阵,这些操作应用于每个 (查看此 post 以获得深入示例 )让我们看一下其中的一些操作:

  1. Scikit-learn 的 MinMaxScaler 执行 (x - min(x))/(max(x)-min(x)) 这会以您只有 0 到 1 之间的值的方式缩放您的数组。如果您想在之后适当地进行一些转换,这可能很有用允许负值(例如,对数变换或缩放 RGB 像素,就像某些 MNIST 示例中所做的那样)
  2. scikit-learns StandardScaler 执行 (x-x.mean())/x.std() 将数组以零为中心并根据特征的方差进行缩放。这是一个标准转换,适用于许多情况,但请记住,您会得到负值。当您拥有不以 0 and/or 为中心且没有单位方差的高斯采样数据时,这尤其有用。

  3. Scikit-learn 的 Normalizer 执行 x / np.linalg.norm(x)。这会将你的 array/vector 的长度设置为 1。如果你想做一些线性代数的东西,比如如果你想实现 Gram-Schmidt 算法,可能会派上用场。

  4. Scikit-learn 的 RobustScaler 可用于缩放具有异常值的数据。均值和标准差对异常值不稳健,因此该缩放器使用中位数并将数据缩放到分位数范围。

  5. 还有其他非线性变换,例如 QuantileTransformer 缩放为分位数范围,PowerTransformer 将任何分布映射到类似于高斯分布的分布。

机器学习中还使用了许多其他规范化,其中大量可能令人困惑。在 ML 中规范化数据背后的想法通常是,您不希望您的模型仅仅因为一个特征具有更高的均值或更大的方差而将其与其他特征区别对待。对于大多数标准情况,我使用 MinMaxScalerStandardScaler,具体取决于根据方差进行缩放对我来说是否重要。