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) #标准差
    
    #1. Min-Max标准化
    def Min_Max(self):
        arr_ = list()
        for x in self.arr:
            arr_.append(round((x - self.x_min) / (self.x_max - self.x_min), 4))
        print("经过Min_Max标准化后的数据为:\n{}".format(arr_))
    
    #2. Z-Score标准化,Standard Score,基于原始数据的均值和标准差。
    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_))
      
    #3. 小数定标标准化,通过移动小数点的位置来进行数据的标准化。小数点移动的位数取决于原始数据中的最大绝对值。
    def DecimalScaling(self):
        arr_ = list()
        j = 1
        x_max = max([abs(i) for i 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("经过DecimalScaling标准化后的数据为:\n{}".format(arr_))
      
    #4. 均值归一化,通过原始数据中的均值、最大、最小值进行。
    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("经过Mean标准化后的数据为:\n{}".format(arr_))
    
    #5. 向量归一化,通过原始数据中的每一个值除以所有数据之和进行。
    def Vector(self):
        arr_ = list()
        for x in self.arr:
            arr_.append(round(x / sum(self.arr), 4))
        print("经过Vector标准化后的数据为:\n{}".format(arr_))
     
    #6. 指数转换
    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(i) for i 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))

执行结果如下:

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐