【问题标题】:StandarScaler, sklearn get the different result from my own calculation?StandardScaler, sklearn 从我自己的计算中得到不同的结果?
【发布时间】:2018-11-01 23:00:03
【问题描述】:

sklearn 中的 StandardScaler 用于通过以下公式对数据进行归一化:x_normalize = (x-mean)/std。但是,我有不同的结果。

这是我的小例子:

a = pd.DataFrame({'X': [1,2,3,4],
                  'Y': [1,2,4,72]})
StandardScaler().fit_transform(a)

结果是:

array([[-1.34164079, -0.6211513 ],
       [-0.4472136 , -0.58802323],
       [0.4472136 , -0.52176709],
       [ 1.34164079,  1.73094161]])

我尝试自己计算:

a.loc[:,'X'].mean()
Out[61]: 2.5
a.loc[:,'X'].std()
Out[62]: 1.2909944487358056
(1-a.loc[:,'X'].mean())/a.loc[:,'X'].std()
Out[63]: -1.161895003862225

可以看到,基于StardardScalea.loc[0,'X']1,那么转换后是-1.3416。但我的结果是-1.1618
我哪里弄错了?

【问题讨论】:

  • 我得到标准为 1.118 和缩放值为 -1.34。
  • 谢谢。但这意味着我对 a.loc[:,'X'].std() 的结果有误。这怎么可能发生?也许我会在另一个 IDE 上尝试一下。现在我正在使用pycharm?

标签: python pandas scikit-learn normalize


【解决方案1】:

Pandas std 和 numpy std 使用不同的公式计算标准差。在 pandas 中,他们使用:

sigma = sqrt(sum((X-X.mean())**2)/len(X-1))

但在 numpy 中标准差计算为:

sigma = sqrt(sum((X-X.mean())**2)/len(X))

在 scikit learn 中,他们使用 numpy 之类的标准差。因此,-1.34 和 -1.16 都是正确的,因为您始终使用一个公式。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多