首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义数据标准化

自定义数据标准化
EN

Stack Overflow用户
提问于 2019-04-06 14:51:37
回答 1查看 46关注 0票数 0

假设我有一个2D numpy数组:

代码语言:javascript
复制
X = np.array[
    [..., ...],

    [..., ...]]

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

代码语言:javascript
复制
X = StandardScaler().fit_transform(X)

或者:

代码语言:javascript
复制
X = (X - X.mean())/X.std()

结果是不同的。他们为什么不一样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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广播来正确地缩放特征向量。

下面的示例显示了如何正确地手动实现它。x1x2是两个有100个训练实例的特性。我们将它们存储在一个特征矩阵X中。

代码语言:javascript
复制
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)

如果您打印这两个,您将看到它们完全匹配,显式地:

代码语言:javascript
复制
print(np.sum(X_scaled-X_scaled_manual))

返回0.0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55550255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档