1. 问题引入:算法相同,数据格式不同,计算出的标准差不同???
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
data = [[-1 ,2],[3,6]]
data_np = np.array(data)
data_df = pd.DataFrame(data)
def fun(x):
return (x - x.mean(axis=0))/(x.std(axis=0))
scaler = StandardScaler()
print('库函数:\n',scaler.fit_transform(data))
print('\ndata_np:\n',fun(data_np))
print('\ndata_df:\n',fun(data_df))
2.问题发现:
- 库函数与使用numpy.array() 标准化计算的一致
- 使用pandas.DataFrame() 标准化计算的与前两者不一致
3.问题思考:
- 计算的中间过程单步执行了,没有问题,只有std()计算的不一致
- 找到原因了!!有偏的标准差与无偏的标准差所造成的
4.问题解决与验证
pandas内置有偏的标准差:
σ
有
偏
=
∑
i
=
1
n
(
x
i
−
x
‾
)
2
n
\Large \sigma_{有偏} = \sqrt{\frac{ \sum^{n}_{i=1}{(x_{i} - \overline{x})} ^{2}}{ \color{red}{n}} }
σ有偏=n∑i=1n(xi−x)2
numpy内置无偏的标准差:
σ
无
偏
=
∑
i
=
1
n
(
x
i
−
x
‾
)
2
n
−
1
\Large \sigma_{无偏} = \sqrt{\frac{ \sum^{n}_{i=1}{(x_{i} - \overline{x})} ^{2}}{ \color{red}{n -1}} }
σ无偏=n−1∑i=1n(xi−x)2
就是上述公式中的n n-1 作祟。
验证一下:
σ
无
偏
2
(
n
−
1
)
=
σ
有
偏
2
n
\Large \sigma_{无偏}^{2} (n-1) = \sigma_{有偏} ^{2}{n}
σ无偏2(n−1)=σ有偏2n
data_np_std = data_np.std(axis=0)[0]**2*2
data_df_std = data_df.std(axis=0)[0]**2*1
print(data_np_std)
print(data_df_std)
print(np.isclose(data_np_std,data_df_std))
5.总结:
实际中采用无偏的更多,直接调用库函数就行。手动实现的时候,就要注意了,使用有偏还是无偏,毕竟std()是根据数据的格式是array()还是Dataframe()采用哪种标准差!!!
完结撒花🎉🎉🎉