数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

1 min-max标准化(Min-maxnormalization)

也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:

数据标准化 python 数据标准化方法_最小值

  • 其中max为样本数据的最大值,min为样本数据的最小值。
  • 这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。

 

2  z-score 标准化(zero-meannormalization)

并非所有数据标准化的结果都映射到[0,1]区间上,其中最常见的标准化方法就是Z标准化,也叫标准差标准化。

数据标准化 python 数据标准化方法_最小值_02

  • z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。

 

3 Decimal scaling小数定标标准化

通过移动数据的小数点位置来进行标准化。小数点移动多少位取决于属性A的取值中的最大绝对值。

数据标准化 python 数据标准化方法_数据_03

  • j为小数点移动位数

 

4 均值标准化

数据标准化 python 数据标准化方法_数据_04

和min-max 标准化类似,将分子中 min(x) 替换成mean(x)

 

5 向量归一化

原始数据中每个值除以所有数值的和。

数据标准化 python 数据标准化方法_最小值_05

 

6 指数转化

6.1 log函数标准化

通过以10为底的log函数转换的方法同样可以实现归一化,具体方法如下:
设总共有n个样本,xi是第i个样本,其中1≤i≤n 。那么第i个样本的标准化为:

数据标准化 python 数据标准化方法_Max_06

6.2 softmax 函数标准化

数据标准化 python 数据标准化方法_最小值_07

6.3 sigmoid 函数标准化

数据标准化 python 数据标准化方法_最小值_08

 

python 实现

import numpy as np
import math

class DataNorm:
    def __init__(self):
        self.arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        self.x_max = max(self.arr)  # 最大值
        self.x_min = min(self.arr)  # 最小值
        self.x_mean = sum(self.arr) / len(self.arr)  # 平均值
        self.x_std = np.std(self.arr)  # 标准差

    def Min_Max(self):
        arr_ = list()
        for x in self.arr:
            # round(x,4) 对x保留4位小数
            arr_.append(round((x - self.x_min) / (self.x_max - self.x_min), 4))
        print("经过Min_Max标准化后的数据为:\n{}".format(arr_))

    def Z_Score(self):
        arr_ = list()
        for x in self.arr:
            arr_.append(round((x - self.x_mean) / self.x_std, 4))
        print("经过Z_Score标准化后的数据为:\n{}".format(arr_))

    
    def DecimalScaling(self):
        arr_ = list()
        j = 1
        x_max = max([abs(one) for one in self.arr])
        while x_max / 10 >= 1.0:
            j += 1
            x_max = x_max / 10
        for x in self.arr:
            arr_.append(round(x / math.pow(10, j), 4))
        print("经过Decimal Scaling标准化后的数据为:\n{}".format(arr_))

    def Mean(self):
        arr_ = list()
        for x in self.arr:
            arr_.append(round((x - self.x_mean) / (self.x_max - self.x_min), 4))
        print("经过均值标准化后的数据为:\n{}".format(arr_))

    def Vector(self):
        arr_ = list()
        for x in self.arr:
            arr_.append(round(x / sum(self.arr), 4))
        print("经过向量标准化后的数据为:\n{}".format(arr_))

    def exponential(self):
        arr_1 = list()
        for x in self.arr:
            arr_1.append(round(math.log10(x) / math.log10(self.x_max), 4))
        print("经过指数转换法(log10)标准化后的数据为;\n{}".format(arr_1))

        arr_2 = list()
        sum_e = sum([math.exp(one) for one in self.arr])
        for x in self.arr:
            arr_2.append(round(math.exp(x) / sum_e, 4))
        print("经过指数转换法(SoftMax)标准化后的数据为;\n{}".format(arr_2))

        arr_3 = list()
        for x in self.arr:
            arr_3.append(round(1 / (1 + math.exp(-x)), 4))
        print("经过指数转换法(Sigmoid)标准化后的数据为;\n{}".format(arr_3))

if __name__ == "__main__":
    dn = DataNorm()
    dn.Min_Max()
    dn.Z_Score()
    dn.DecimalScaling()
    dn.Mean()
    dn.Vector()
    dn.exponential()