在 Python numpy 中标准化矩阵

数据挖掘 Python 麻木的 矩阵
2021-10-04 00:59:36

我有一个这样的数组:

 array([[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15]])

我想让这个数组在 -1 和 1 之间标准化。我目前正在使用 numpy 作为库。

2个回答

nazz 的答案并非在所有情况下都有效,并且不是进行您尝试执行的缩放的标准方式(有无数种可能的方式可以缩放到 [-1,1] )。我假设您想分别缩放每一列:

1)你应该除以绝对最大值:

arr = arr - arr.mean(axis=0)
arr = arr / np.abs(arr).max(axis=0)

2) 但是如果一列的最大值为 0(当该列全为零时会发生这种情况),您将收到错误消息(您不能除以 0)。

arr = arr - arr.mean(axis=0)
safe_max = np.abs(arr).max(axis=0)
safe_max[safe_max==0] = 1
arr = arr / safe_max

不过,这不是执行此操作的标准方法。您正在尝试做一些“特征缩放”,请参见此处

那么公式是:

import numpy as np

def scale(X, x_min, x_max):
    nom = (X-X.min(axis=0))*(x_max-x_min)
    denom = X.max(axis=0) - X.min(axis=0)
    denom[denom==0] = 1
    return x_min + nom/denom 

X = np.array([
    [ 0,  1],
    [ 2,  3],
    [ 4,  5],
    [ 6,  7],
    [ 8,  9],
    [10, 11],
    [12, 13],
    [14, 15]
])
X_scaled = scale(X, -1, 1)
print(X_scaled)

结果:

[[-1.         -1.        ]
 [-0.71428571 -0.71428571]
 [-0.42857143 -0.42857143]
 [-0.14285714 -0.14285714]
 [ 0.14285714  0.14285714]
 [ 0.42857143  0.42857143]
 [ 0.71428571  0.71428571]
 [ 1.          1.        ]]

如果要缩放整个矩阵(不是按列),请删除axis=0更改. denom[denom==0] = 1denom = denom + (denom is 0)

假设你有一个数组arr您可以像这样对其进行标准化:

arr = arr - arr.mean()
arr = arr / arr.max()

您首先减去平均值以使其居中 0,然后除以最大值以将其缩放到 [1,1].