使用sklearn的StandardScaler缩放数据后,数据的平均值不为零。

10
我有以下代码
import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np

df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
df.dropna(how="all", inplace=True) # drops the empty line at file-end 

X = df.ix[:,0:4].values
y = df.ix[:,4].values

接下来我要对数据进行缩放,并获取平均值:

X_std = StandardScaler().fit_transform(X)
mean_vec = np.mean(X_std, axis=0)

我不明白的是,我的输出是这样的:
[ -4.73695157e-16  -6.63173220e-16   3.31586610e-16  -2.84217094e-16]

我很难理解这些值为什么不是0。如果我按比例缩放,它应该是0才对吧?

有人能解释一下这里发生了什么吗?


3
-4.73695157e-16 等同于 -0.000000000000000473695157,基本上等于 0。 - jkr
1个回答

16

实际上,这些值非常接近于0,您可以将它们视为0。

缩放器试图将均值设置为零,但由于数值表示的限制,它只能使均值非常接近于0。

请查看有关浮点算术精度的问题。

同样有趣的是机器ϵ的概念,对于64位浮点数大约为2.22e-16。


为什么它会是非零的呢?难道不只需要从目标特征数组计算出的实际平均值中减去即可吗? - sandyp
@sandyp 你必须明白减去平均值并没有无限精度,因此实际平均值和被减去的值之间的误差将成为新的平均值。 - João Almeida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接