【问题标题】:How to scale each column of a matrix如何缩放矩阵的每一列
【发布时间】:2018-05-03 16:14:14
【问题描述】:

这就是我缩放单个向量的方式:

vector = np.array([-4, -3, -2, -1, 0])

# pass the vector, current range of values, the desired range, and it returns the scaled vector
scaledVector = np.interp(vector, (vector.min(), vector.max()), (-1, +1)) # results in [-1.  -0.5  0.   0.5  1. ]

如何将上述方法应用于给定matrix 的每一列?

matrix = np.array(
      [[-4, -4, 0, 0, 0],
      [-3, -3, 1, -15, 0],
      [-2, -2, 8, -1, 0],
      [-1, -1, 11, 12, 0],
      [0, 0, 50, 69, 80]])

scaledMatrix = [insert code that scales each column of the matrix]

请注意,scaledMatrix 的前两列应等于第一个示例中的 scaledVector。对于上面的matrix,正确计算的scaledMatrix是:

[[-1.         -1.         -1.         -0.64285714 -1.        ]
 [-0.5        -0.5        -0.96       -1.         -1.        ]
 [ 0.          0.         -0.68       -0.66666667 -1.        ]
 [ 0.5         0.5        -0.56       -0.35714286 -1.        ]
 [ 1.          1.          1.          1.          1.        ]]

我目前的做法(错误):

np.interp(matrix, (np.min(matrix), np.max(matrix)), (-1, +1))

【问题讨论】:

  • 看起来 scaledMatrix 的第 4 列有错误。 P. Camilleri 有正确的价值观。
  • 你对常量列的期望是什么?

标签: python arrays numpy matrix


【解决方案1】:

如果您想手动完成并了解发生了什么:

首先减去按列的最小值,使每列的最小值为 0。

然后除以按列的幅度(最大值 - 最小值),使每列的最大值为 1。

现在每一列都在 0 和 1 之间。如果你希望它在 -1 和 1 之间,乘以 2,然后减去 1:

In [3]: mins = np.min(matrix, axis=0)

In [4]: maxs = np.max(matrix, axis=0)

In [5]: (matrix - mins[None, :]) / (maxs[None, :] - mins[None, :])
Out[5]: 
array([[ 0.        ,  0.        ,  0.        ,  0.17857143,  0.        ],
       [ 0.25      ,  0.25      ,  0.02      ,  0.        ,  0.        ],
       [ 0.5       ,  0.5       ,  0.16      ,  0.16666667,  0.        ],
       [ 0.75      ,  0.75      ,  0.22      ,  0.32142857,  0.        ],
       [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ]])

In [6]: 2 * _ - 1
Out[6]: 
array([[-1.        , -1.        , -1.        , -0.64285714, -1.        ],
       [-0.5       , -0.5       , -0.96      , -1.        , -1.        ],
       [ 0.        ,  0.        , -0.68      , -0.66666667, -1.        ],
       [ 0.5       ,  0.5       , -0.56      , -0.35714286, -1.        ],
       [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ]])

我使用[None, :] 表示 numpy 以了解我说的是“行向量”,而不是列向量。

否则,使用美妙的sklearn 包,它的preprocessing 模块有很多有用的转换器:

In [13]: from sklearn.preprocessing import MinMaxScaler

In [14]: scaler = MinMaxScaler(feature_range=(-1, 1))

In [15]: scaler.fit(matrix)
Out[15]: MinMaxScaler(copy=True, feature_range=(-1, 1))

In [16]: scaler.transform(matrix)
Out[16]: 
array([[-1.        , -1.        , -1.        , -0.64285714, -1.        ],
       [-0.5       , -0.5       , -0.96      , -1.        , -1.        ],
       [ 0.        ,  0.        , -0.68      , -0.66666667, -1.        ],
       [ 0.5       ,  0.5       , -0.56      , -0.35714286, -1.        ],
       [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ]])

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2021-02-18
    • 2013-05-09
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多