归一化与标准化

一、归一化

对原始数据缩放到 0-1 之间,是线性变换。也叫最大最小标准化,离散标准化。

区间也可以设置为其他,一般为 0 - 1。

公式:

X=x−minmax−min X = \frac{x-min}{max-min } X=maxminxmin

min 为数据最小值,max 为数据最大值,x 为原始数据值,X 为归一化后的值。

x=X′(max−min)+min x = X^{\prime}(max-min)+min x=X(maxmin)+min

特点

虽然归一化可以保留原始数据中存在的关系,但是计算用到的最大值与最小值非常容易受异常点影响,所以只适合精确小数据量。

实现

使用 sklearn 包来实现归一化:

from sklearn.preprocessing import MinMaxScaler
preprocess = MinMaxScaler()
raw_data = [[10, 10, 100, 1000],
            [5, 1, 21, 5],
            [1, 2, 15, 1]]
data = preprocess.fit_transform(raw_data)

会输出 array 数据格式,可以看到最后一列中的 1000 由于数据值太大,导致 5 相对其来说只能得到 0.004,在实际数据中,如果 1000 为噪声数据就会极大的影响最终的分析结果。当然,如果数据准确且数据较少的情况下,推荐使用该方法。

Out[3]: 
array([[1.        , 1.        , 1.        , 1.        ],
       [0.44444444, 0.        , 0.07058824, 0.004004  ],
       [0.        , 0.11111111, 0.        , 0.        ]])

使用 pandas 包

import pandas as pd
df = pd.DataFrame([[10, 10, 100, 1000],
            [5, 1, 21, 5],
            [1, 2, 15, 1]])
# 方法一:
df1 = df.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)), axis=0)
# 方法二:
df2 = (df - df.min()) / (df.max() - df.min())

方法一输出,与 sklearn 结果一致,格式为 dataframe

          0         1         2         3
0  1.000000  1.000000  1.000000  1.000000
1  0.444444  0.000000  0.070588  0.004004
2  0.000000  0.111111  0.000000  0.000000

方法二输出,与 sklearn 结果一致,格式为 dataframe

          0         1         2         3
0  1.000000  1.000000  1.000000  1.000000
1  0.444444  0.000000  0.070588  0.004004
2  0.000000  0.111111  0.000000  0.000000

二、z-score 标准化

标准化方法很多,今天先介绍使用最多的 z-score 标准化。

这种方法是将原始数据变换到均值为 0,方差为 1 的范围内。

公式

X=x−meanσ X=\frac{x-mean}{\sigma} X=σxmean
σ=std=(x1−mean)2+(x2−mean)2+⋯+(xn−mean)2n \sigma=\sqrt{std}=\sqrt{\frac{(x_1-mean)^2+(x_2-mean)^2+{\cdots}+(x_n-mean)^2}{n}} σ=std=n(x1mean)2+(x2mean)2++(xnmean)2

特点

对于大数据样本量,如果出现异常点,少量异常点对于平均值影响小,方差也小,对最终结果影响不大。因此,该方法适合样本量大,数据噪点多的数据集

from sklearn.preprocessing import StandardScaler
preprocess = StandardScaler()
raw_data = [[10, 10, 100, 1000],
            [5, 1, 21, 5],
            [1, 2, 15, 1]]
data = preprocess.fit_transform(raw_data)
data.mean_
data.std_
# 标准差
df.std()

输出

array([[ 1.26750044,  1.40693001,  1.41138272,  1.41420503],
       [-0.09053575, -0.82760589, -0.62823743, -0.70284713],
       [-1.1769647 , -0.57932412, -0.78314529, -0.71135789]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白墨石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值