如何用sklearn规范化二维数组?

How to normalize 2D array with sklearn?

给定一个二维数组,我想将其归一化到 0-1 范围内。

我知道这可以实现如下

import numpy as np
from sklearn.preprocessing import normalize,MinMaxScaler

np.random.seed(0)
t_feat=4
t_epoch=3
t_wind=2

result = [np.random.rand(t_epoch, t_feat) for _ in range(t_wind)]
wdw_epoch_feat=np.array(result)
matrix=wdw_epoch_feat[:,:,0]

xmax, xmin = matrix.max(), matrix.min()
x_norm = (matrix - xmin)/(xmax - xmin)

产生

[[0.55153917 0.42094786 0.98439526], [0.57160496 0.         1.        ]]

但是,我无法使用 sklearn

MinMaxScaler 得到相同的结果
scaler = MinMaxScaler()
x_norm = scaler.fit_transform(matrix)

产生

[[0. 1. 0.], [1. 0. 1.]]

感谢任何想法

您正在对整个矩阵进行标准化。 MinMaxScaler 专为机器学习而设计,因此根据您的定义对每行或每列执行标准化。要获得与您相同的结果,您需要将二维数组转换为一维数组。我在下面显示这个并在第一列中得到相同的结果:

import numpy as np
from sklearn.preprocessing import normalize, MinMaxScaler

np.random.seed(0)
t_feat=4
t_epoch=3
t_wind=2

result = [np.random.rand(t_epoch, t_feat) for _ in range(t_wind)]
wdw_epoch_feat=np.array(result)
matrix=wdw_epoch_feat[:,:,0]

xmax, xmin = matrix.max(), matrix.min()
x_norm = (matrix - xmin)/(xmax - xmin)


matrix = np.array([matrix.flatten(), np.random.rand(len(matrix.flatten()))]).T
scaler = MinMaxScaler() 
test  = scaler.fit_transform(matrix)

print(test)
-------------------------------------------
[[0.55153917 0.        ]
 [0.42094786 0.63123194]
 [0.98439526 0.03034732]
 [0.57160496 1.        ]
 [0.         0.48835502]
 [1.         0.35865137]]

当您使用 MinMaxScaler 进行机器学习时,您通常希望标准化每一列。

一个聪明的方法是将数据重塑为一维,应用变换并将其重塑回原始 -

import numpy as np

X = np.array([[-1, 2], [-0.5, 6]])
scaler = MinMaxScaler()
X_one_column = X.reshape([-1,1])
result_one_column = scaler.fit_transform(X_one_column)
result = result_one_column.reshape(X.shape)
print(result)
[[ 0.          0.42857143]
 [ 0.07142857  1.        ]]