假设我有一个二维的numpy数组:
X = np.array[
[..., ...],
[..., ...]]
我想用以下方法标准化数据:
X = StandardScaler().fit_transform(X)
或:
X = (X - X.mean())/X.std()
结果不同。他们为什么不同?
答案 0 :(得分:1)
假设X
是形状为(n x m)
的特征矩阵(n个实例和m个特征)。我们要缩放每个特征,以便其实例以均值为零和单位方差分布。
为此,您需要为提供的实例(X
的列)计算每个特征的均值和标准差,然后计算缩放的特征向量。当前,您正在计算整个数据集的均值和标准差,并使用这些值缩放数据:这将在除了少数特殊情况(即X = np.ones((100,2))
是一种特殊情况)之外给您毫无意义的结果。 / p>
实际上,要为每个功能计算这些统计信息,您需要将axis
或.mean()
方法的.std()
参数设置为0。这将沿着列和返回一个(1 x m)
形状的数组(实际上是一个(m,)
数组,但这就是另一个故事),其中每个值都是给定列的均值或标准差。然后,您可以使用numpy广播来正确缩放特征向量。
以下示例显示了如何正确地手动实现它。 x1
和x2
是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。