几种数据标准化方法

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

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

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

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

 

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

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

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

 

3 Decimal scaling小数定标标准化

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

x^{'}=\frac{x}{10^{j}}

  • j为小数点移动位数

 

4 均值标准化

y_{i}=\frac{x_{i}-\underset{1\leqslant j\leqslant n}{mean}(x_{j})}{\underset{1\leqslant j\leqslant n}{max}(x_{j})-\underset{1\leqslant j\leqslant n}{min}(x_{j})}

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

 

5 向量归一化

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

x^{'}=\frac{x}{\sum_{i=1}^{n}x_{i}}

 

6 指数转化

6.1 log函数标准化

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

6.2 softmax 函数标准化

x^{'}=\frac{e^{x}}{\sum_{i=1}^{n}e^{x_{i}}}

6.3 sigmoid 函数标准化

x^{'}=\frac{1}{1+e^{-x}}

 

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()

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值