假设我有一个2D numpy数组:
X = np.array[
[..., ...],
[..., ...]]我想用以下方法来标准化这些数据:
X = StandardScaler().fit_transform(X)或者:
X = (X - X.mean())/X.std()结果是不同的。他们为什么不一样?
发布于 2019-04-09 20:28:16
假设X是形状(n x m)的特征矩阵(n个实例和m个特征)。我们希望对每个特性进行缩放,以便其实例以零的均值和单位方差的方式分布。
要做到这一点,您需要为提供的实例(X列)计算每个特性的均值和标准差,然后计算缩放的特征向量。目前,您正在计算整个数据集的平均值和标准差,并使用这些值对数据进行缩放:这将在除少数特殊情况之外的所有情况下给出毫无意义的结果(即,X = np.ones((100,2))是这样的特例)。
实际上,要计算每个特性的这些统计信息,需要将.mean()或.std()方法的.std()参数设置为0。这将沿列执行计算,并返回一个(1 x m)形状数组(实际上是一个(m,)数组,但这是另一个故事),其中每个值都是给定列的均值或标准差。然后,可以使用numpy广播来正确地缩放特征向量。
下面的示例显示了如何正确地手动实现它。x1和x2是两个有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。
https://stackoverflow.com/questions/55550255
复制相似问题