开发过程中经常遇到需要把数据归一化处理的情况,简单记录几种归一化方法。

需求1: 归一化(将一组数转换到[0~1]区间内)一组数据,数据包含正负数,归一化后的数据列保持其原数据列的大小顺序。

def normalization(data):
    归一化函数
    把所有数据归一化到[0,1]区间内,数据列表中的最大值和最小值分别映射到1和0,所以该方法一定会出现端点值0和1。
    此映射是线性映射,实质上是数据在数轴上等比缩放。
    :param data: 数据列表,数据取值范围:全体实数
    :return:
    min_value = min(data)
    max_value = max(data)
    new_list = []
    for i in data:
        new_list.append((i-min_value) / (max_value-min_value))
    return new_list
if __name__ == '__main__':
    d = [-3, 4, 6, -1, -5]
    print(normalization(d))
    # [0.18181818181818182, 0.8181818181818182, 1.0, 0.36363636363636365, 0.0]

上述方法满足了需求,需要注意的是,这个方法会使 归一化结果中出现端点值(即0和1)

需求2: 归一化一组数据(包含正负数),并使得归一化后的数据和为1,保持其原数据的大小顺序。

分析:要使得归一化结果和为1,就需要考虑 先求和,后逐个求比值。

def softmax_linear_mapping(data):
    线性映射归一化函数。归一化到[0, 1]区间,且和为1。归一化后的数据列依然保持原数据列中的大小顺序。
    局限性:仅适用于非负数据
    :param data: 非负数据列,数据取值范围:非负数
    :return:
    sum_all = sum(data)
    new_list = []
    for i in data:
        new_list.append(i / sum_all)
    return new_list
if __name__ == '__main__':
    d = [3, 4, 6, 1, 5]
    print(softmax_linear_mapping(d))
    # [0.15789473684210525, 0.21052631578947367, 0.3157894736842105, 0.05263157894736842, 0.2631578947368421]
    d = [-3, 4, 6, -1, -5]
    print(softmax_linear_mapping(d))
    # [-3.0, 4.0, 6.0, -1.0, -5.0]

但不幸的是,这个方法有先天缺陷:不能处理负数列。

为了解决这个问题,尝试引入一个 非线性函数 ,将数据区间(-∞, +∞)映射到(0, +∞)上,这样就可以愉快的玩耍了。

优化 [社会我白哥,人狠话不多]

import math
def softmax(data):
    非线性映射归一化函数。归一化到[0, 1]区间,且和为1。归一化后的数据列依然保持原数据列中的大小顺序。
    非线性函数使用以e为底的指数函数:math.exp()。
    使用它可以把输入数据的范围区间(-∞, +∞)映射到(0, +∞),这样就可以使得该函数有能力处理负数。
    :param data: 数据列,数据的取值范围是全体实数
    :return:
    exp_list = [math.exp(i) for i in data]
    sum_exp = sum(exp_list)
    new_list = []
    for i in exp_list:
        new_list.append(i / sum_exp)
    return new_list
if __name__ == '__main__':
    d = [3, 4, 6, 1, 5]
    print(softmax(d))
    # [0.031920112758713086, 0.0867678624743735, 0.6411326034074455, 0.0043199175011450494, 0.235859503858323]
    d = [-3, 4, 6, -1, -5]
    print(softmax(d))
    # [0.00010859836836988283, 0.11909257170564182, 0.8799816932989085, 0.0008024394361374001, 1.4697190942372094e-05]

~ 完美 ~

Mr.bai

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。以下是三种常用的归一化方法: min-max标准化(Min-Max Normalization) 也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 , 1]之间。转换函数如下:  其中max为样本数据的最大值,min为样本数据的最小值。这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变
心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,谦虚,自律,反思,成长,还算是比较正能量的博主,公益免费传播……内心特别想在AI界做出一些可以推进历史进程影响力的东西(兴趣使然,有点小情怀,也有点使命感呀)…… 12-07
本文实例讲述了Python数据预处理之数据规范化。分享给大家供大家参考,具体如下: 数据规范化 为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化(归一化)处理,将数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。 数据规范化方法主要有: – 最小-最大规范化 – 零-均值规范化 数据示例 #-*- coding: utf-8 -*- #数据规范化 import pandas as pd import numpy as np datafile = 'normalization_data.xls' #参数初始化 data = pd.read_excel(dat
数据归一化是指将数据按比例缩放,使之落入一个小的特定区间。在机器学习中,通常使用的是将数据归一化到0~1之间或者-1~1之间。这样做的目的是使得不同规模和单位的特征可以在同等条件下进行比较和权衡。在 Python 中,可以使用 Scikit-learn 库中的 MinMaxScaler 类来进行数据归一化处理。 以下是一个简单数据归一化处理的示例: ``` python from sklearn.preprocessing import MinMaxScaler import numpy as np data = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) scaler = MinMaxScaler() print(scaler.fit_transform(data)) 输出结果为: [[0. 0. ] [0.25 0.25 ] [0.5 0.5 ] [0.75 0.75 ] [1. 1. ]] 其中,fit_transform() 方法可以同时进行拟合和转换操作。在拟合数据后,可以使用 transform() 方法来对新数据进行归一化处理。