机器学习-归一化方法
本文最后更新于 1593 天前,其中的信息可能已经有所发展或是发生改变。

1. 归一化 (Normalization)

引入归一化,是由于在不同评价指标(特征指标)中,其量纲或是量纲单位往往不同,变化区间处于不同的数量级,若不进行归一化,可能导致某些指标被忽视,影响到数据分析的结果。

为了消除特征数据之间的量纲影响,需要进行归一化处理,以解决特征指标之间的可比性。原始数据经过归一化处理后,各指标处于同一数量级,以便进行综合对比评价。

1. 必要性

举例:

以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。
$$
h_\theta (x) = \theta_1 x_1 + \theta_2 x_2
$$

Cost function 等高线可能如下:

1540518066464

解决的方法是尝试将所有特征的尺度都尽量缩放到 0 到 1 之间。如图:

1540518189163

2. 场合

图像或是视频的数据值处于固定区间,往往对整个样本进行归一化。但是,有一些样本,比如多个特征序列组成的样本,要对每列进行归一化。还有一些是多传感器序列以及多通道信号,都要分别对每列进行归一化。

总结就是如果样本中具有不同量纲的指标,最好进行归一化。 在深度学习任务中,仍然需要进行归一化。

3. 归一化方法

3.1 min-max 标准化

又称线性归一化、离差归一化。

使用线性函数将原始数据线性化的方法转换到[0 1]的范围,归一化公式如下:
$$
x_{norm} = \frac{x – x_{min}}{x_{max} – x_{min}}
$$

使用场景概括:
在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用此方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。

3.2 Z-score 标准化方法

零均值标准化,此归一化方式要求原始数据的分布可以近似为高斯分布

将原始数据集归一化为均值为0、方差1的数据集。
$$
x^* = \frac{x – \mu}{\sigma}
$$
其中,$\mu$、$\sigma$ 分别为原始数据集的均值和方法。

使用场景概括:

在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,此法表现更好。

3.3 非线性归一化

常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。例如:
$$
x^* = log_{10}(x)
$$

2. 归一化方法 python 实现

Python实现上述归一化方法。

2.1 自实现

def minMaxNorm(dataSet_org):
    '''min-max normalization'''
    numSamples, dim = dataSet_org.shape
    dataSet_norm = np.zeros((numSamples, dim), dtype=np.float32)
    minData = np.min(dataSet_org, axis=0)
    maxData = np.max(dataSet_org, axis=0)
    for ii in range(dim):
        dataSet_norm[:, ii] = (dataSet_org[:, ii] - minData[ii]) / (maxData[ii] - minData[ii])

    return dataSet_norm


def zScoreNorm(dataSet_org):
    '''Z score normalization'''
    numSamples, dim = dataSet_org.shape
    dataSet_norm = np.zeros((numSamples, dim), dtype=np.float32)
    mu = np.average(dataSet_org, axis=0)
    sigma = np.std(dataSet_org, axis=0)
    for ii in range(dim):
        dataSet_norm[:, ii] = (dataSet_org[:, ii] - mu[ii]) / sigma[ii]

    return dataSet_norm

2.2 Scikit-learn 函数

Scikit-learn官方中文帮助文档

2.2.1 max-min 归一化

MinMaxScaler缩放到 [0, 1]

>>> from sklearn import preprocessing
>>> import numpy as np
>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()

>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])

对测试数据实现和训练数据一致的缩放和移位操作:

>>> X_test = np.array([[ -3., -1.,  4.]])
>>> X_test_minmax = min_max_scaler.transform(X_test)
>>> X_test_minmax
array([[-1.5       ,  0.        ,  1.66666667]])

检查缩放器(scaler)属性,来观察在训练集中学习到的转换操作的基本性质:

>>> min_max_scaler.scale_                             
array([ 0.5       ,  0.5       ,  0.33...])

>>> min_max_scaler.min_                               
array([ 0.        ,  0.5       ,  0.33...])

2.2.2 零均值归一化

StandardScaler:

>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
>>> scaler = preprocessing.StandardScaler().fit(X_train)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)

>>> scaler.mean_                                      
array([ 1. ...,  0. ...,  0.33...])

>>> scaler.scale_                                       
array([ 0.81...,  0.81...,  1.24...])

>>> X_train_scaled = scaler.transform(X_train)                     
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])

# 查看标准化后的均值与方差
>>> np.mean(X_train_scaled[:, 2])  # 查看最后一列的均值
0.0
>>> np.std(X_train_scaled[:, 0])  # 查看第一列的方差
0.99999999999999989

在新的数据上实现和训练集相同缩放操作:

>>> X_test = [[-1., 1., 0.]]
>>> X_test_scaled = scaler.transform(X_test)                
array([[-2.44...,  1.22..., -0.26...]])
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇