sklearn定制的数据标准化

时间:2019-04-06 14:51:38

标签: scikit-learn

假设我有一个二维的numpy数组:

X = np.array[
    [..., ...],

    [..., ...]]

我想用以下方法标准化数据:

X = StandardScaler().fit_transform(X)

或:

X = (X - X.mean())/X.std()

结果不同。他们为什么不同?

1 个答案:

答案 0 :(得分:1)

假设X是形状为(n x m)的特征矩阵(n个实例和m个特征)。我们要缩放每个特征,以便其实例以均值为零和单位方差分布。

为此,您需要为提供的实例(X的列)计算每个特征的均值和标准差,然后计算缩放的特征向量。当前,您正在计算整个数据集的均值和标准差,并使用这些值缩放数据:这将在除了少数特殊情况(即X = np.ones((100,2))是一种特殊情况)之外给您毫无意义的结果。 / p>

实际上,要为每个功能计算这些统计信息,您需要将axis.mean()方法的.std()参数设置为0。这将沿着列和返回一个(1 x m)形状的数组(实际上是一个(m,)数组,但这就是另一个故事),其中每个值都是给定列的均值或标准差。然后,您可以使用numpy广播来正确缩放特征向量。

以下示例显示了如何正确地手动实现它。 x1x2是2个要素,具有100个训练实例。我们将它们存储在特征矩阵X中。

x1 = np.linspace(0, 100, 100)
x2 = 10 * np.random.normal(size=100) 
X = np.c_[x1, x2]

# scale the data using the sklearn implementation
X_scaled = StandardScaler().fit_transform(X)

# scale the data taking mean and std along columns
X_scaled_manual = (X - X.mean(axis=0)) / X.std(axis=0)

如果打印两个,则将看到它们完全匹配,明确地:

print(np.sum(X_scaled-X_scaled_manual))

返回0.0。