为什么Python的'StandardScaler'和Matlab的'zscore'之间的标准化不同?

时间:2018-03-07 11:01:34

标签: python matlab machine-learning data-processing

为什么Python中sklearn.preprocessing.StandardScaler的标准化与Matlab中的zscore不同?

Python中sklearn.preprocessing的示例:

>>> from sklearn.preprocessing import StandardScaler
>>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]
>>> scaler = StandardScaler()
>>> scaler.fit(data)
>>> print(scaler.mean_)
    [ 0.5  0.5]
>>> print(scaler.var_)
    [0.25 0.25]
>>> print(scaler.transform(data))
[[-1. -1.]
[-1. -1.]
[ 1.  1.]
[ 1.  1.]]

Matlab中与zscore函数相同的示例:

>> data = [[0, 0]; [0, 0]; [1, 1]; [1, 1]];
>> [Sd_data,mean,stdev] = zscore(data)

    Sd_data =
   -0.8660   -0.8660
   -0.8660   -0.8660
    0.8660    0.8660
    0.8660    0.8660

    mean =
    0.5000    0.5000

    stdev =
    0.5774    0.5774    

1 个答案:

答案 0 :(得分:1)

似乎问题在于自由度(ddof - 与标准偏差估计相关的校正因子),默认情况下StandardScaler似乎为0。

作为替代方案,scipy.stats zscore功能允许您在缩放时控制此参数:

from scipy.stats import zscore

zscore(data, ddof=1)
array([[-0.8660254, -0.8660254],
       [-0.8660254, -0.8660254],
       [ 0.8660254,  0.8660254],
       [ 0.8660254,  0.8660254]])

最终得到与matlab函数相同的输出。当您使用zscore致电ddof=0时,您获得与StandardScaler相同的输出。