数据标准化——Python实现

为君一笑 提交于 2020-01-29 18:07:46

在家没事梳理下数据标准化的东西,这数据预处理的基础东西,有大佬路过可以拿去跑一下,应该没有错误,下一篇讲数据离散化!

```# 数据标准化(Normalization)是指:将数据按照一定的比例进行缩放,使其落入一个特定的小区间。最经典就是数据的归一化处理,即将数据统一映射到【0,1】之间。
# 常用的数据标准化有6种
# 1.Min-Max 标准化
# Min-Max 标准化是指对原始数据进行线性变换,将值映射到【0,1】之间。
# 公式为: X' = (X-Xmin)/(Xmax-X)
# 2.Z-Score 标准化
# Z-Score(也叫 Standard Score,标准分数)标准化是指:基于原始数据的均值(mean)和标准差(standard deviation)来进行数据的标准化。
# 公式为: X' = (x-μ)/a  为了方便,标准的数学符合用a、b等符号代替,x是原始数据,μ表示原始数据的均值,a表示原始数据的保准差
# 3.小数定标(Decimal scaling)标准化
# 小数定标标准化是指:通过移动小数点的位置来进行数据的标准化。小数点移动的位数取决于原始数据中的最大绝对值。
# 公式为:X' = x/10^j  (j是10的指数) j表示满足条件的最小整数
# 例如:一组数据为[-309,-10,-43,87,344,970],其中绝对值最大的是970.为使用小数定标标准化,用1000(即j=3)除以每个值。这样,-309标准化为-0.309,970被标准化为0.97
# 4.均值归一法
# 均值归一法是指:通过原始数据中的均值、最大值和最小值来进行数据的标准化。
# 公式为: X'= (x-μ)/(Xmax - Xmin) 分母也可以用Xmax代替
# 向量归一化
# 向量归一化是指:通过用原始数据中的每个值除以所有数据之和来进行数据的标准化。
# 公式为:X' = x/(∑Xi)分母表示原始数据中所有数据的和
# 6.指数转换
# 指数转换是指:通过原始数据的值进行相应的指数函数变换来进行数据的标准化。常见的函数有lg函数、Softmax函数和Sigmoid函数。
# lg函数的公式:  X' = lg(X)/ lg(Xmax)
# Softmax函数的公式: X' = e^x / (∑e^xi),e是自然常数 分母表示的是原始数据中每个数据被e求指数后的和,分子表示的是一个数据被e求指数
# Sigmoid函数的公式: X' = 1/(1+e^-x)
# 下面对原始数据[1,2,3,4,5,6,7,8,9]




# -*-coding:utf-8-*-

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 = self.x_max // 10 if self.x_max % 10 == 0 else self.x_max // 10 + 1
    #     for x in self.arr:
    #         arr_.append(round(x / math.pow(10, j), 4))
    #     print("经过Decimal Scaling标准化后的数据为:\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()


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!