我试图从平均值中减去列中的每个元素并除以标准偏差。我是以两种不同的方式(numeric_data1
和numeric_data2
)完成的:
import pandas as pd
data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")
numeric_data = data.drop("color", 1)
numeric_data1 = ((numeric_data - numeric_data.mean()) /
numeric_data.std())
numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) /
np.std(numeric_data, axis=0))
type(numeric_data1) # -> pandas.core.frame.DataFrame
type(numeric_data2) # -> pandas.core.frame.DataFrame
两者都是pandas数据帧,它们应该具有相同的结果。但是,我得到了不同的结果:
numeric_data2 == numeric_data1 # -> False
我认为问题源于numpy和pandas如何处理数值精度:
numeric_data.mean() == np.mean(numeric_data, axis=0) # -> True
numeric_data.std(axis=0) == np.std(numeric_data, axis=0) # -> False
对于平均的numpy和熊猫给了我同样的东西,但对于标准偏差,我得到的结果几乎没有。
我的评估是正确还是我犯了一些错误?
答案 0 :(得分:7)
在计算标准差时,重要的是你是用这个总体的较小样本估计整个人口的标准差,还是计算整个人口的标准差。
如果它是较大人口的较小样本,则需要所谓的样本标准差。事实证明,当你将平方差的平方和平均值除以观察数量时,你最终会得到一个有偏差的估计量。我们通过除以观察数量的一个来校正它。我们使用参数ddof=1
来控制样本标准差,或者ddof=0
来控制人口标准差。
事实是,如果您的样本量很大,则无关紧要。但是你会发现很小的差异。
使用pandas.DataFrame.std
来电中的自由度参数:
import pandas as pd
data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")
numeric_data = data.drop("color", 1)
numeric_data1 = ((numeric_data - numeric_data.mean()) /
numeric_data.std(ddof=0)) # <<<
numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) /
np.std(numeric_data, axis=0))
np.isclose(numeric_data1, numeric_data2).all() # -> True
或np.std
来电:
import pandas as pd
data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")
numeric_data = data.drop("color", 1)
numeric_data1 = ((numeric_data - numeric_data.mean()) /
numeric_data.std())
numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) /
np.std(numeric_data, axis=0, ddof=1)) # <<<
np.isclose(numeric_data1, numeric_data2).all() # -> True