代码之家  ›  专栏  ›  技术社区  ›  mpx

如何用sklearn规范二维数组?

  •  0
  • mpx  · 技术社区  · 4 年前

    给定一个二维数组,我想将其规格化为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.        ]]
    

    但是,使用 MinMaxScaler 属于 sklearn

    scaler = MinMaxScaler()
    x_norm = scaler.fit_transform(matrix)
    

    产生

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

    谢谢你的好意

    2 回复  |  直到 4 年前
        1
  •  1
  •   WolVes    4 年前

    你正在标准化整个矩阵。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进行机器学习时,通常需要标准化每个列。

        2
  •  1
  •   Akshay Sehgal    4 年前

    一个聪明的方法是将数据重塑为1D,应用转换并将其重塑为原始数据-

    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.        ]]