Python---数据标准化

数据标准化(Normalization)

定义:将数据按照一定的比例进行缩放,使其落入一个特定的区间。
好处:加快模型的收敛速度,提高模型预测精度
常见的六种标准化方法:

  • Min-Max标准化:对原始数据进行线性变换,将值映射至[0, 1]区间。
  • Z-Score标准化:基于原始数据的均值(mean)和标准差(std)来进行数据的标准化。
  • 小数定标(Decimal scaling)标准化:通过移动小数点的位置来进行数据的标准化。
  • 均值归一化:通过原始数据的均值、最大值和最小值来进行数据的标准化。
  • 向量归一化:通过用原始数据中的每个值除以所有数据之和来进行数据的标准化。
  • 指数转换:通过对原始数据的值进行相应的指数变换来进行数据的标准化。进行指数转换常见的函数方法有lg函数、SoftMax函数和Sigmoid函数。

代码实现

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:
           # round(x, 4) 对x保留4位小数
           arr_.append(round((x - self.x_mean)/self.x_std, 4))
       print("经过Z_Score标准化后的数据为:\n{}".format(arr_))
       
   # 小数定标标准化
   def DecimaScaling(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 /= 10
       for x in self.arr:
           arr_.append(round(x / math.pow(10, j), 4))
       print("经过DecimaScaling标准化后的数据为:\n{}".format(arr_))
   
   #均值归一化法
   def Mean(self):
       arr_ = list()
       for x in self.arr:
           # round(x, 4) 对x保留4位小数
           arr_.append(round((x - self.x_mean)/(self.x_max - self.x_min), 4))
       print("经过Mean标准化后的数据为:\n{}".format(arr_))
   
   # 向量归一化法
   def Vector(self):
       arr_ = list()
       for x in self.arr:
           # round(x, 4) 对x保留4位小数
           arr_.append(round( x/sum(self.arr), 4))
       print("经过Vector标准化后的数据为:\n{}".format(arr_))
       
   # 指数转换法
   def exponential(self):
       arr_1 = list()
       for x in self.arr:
           # round(x, 4) 对x保留4位小数
           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:
           # round(x, 4) 对x保留4位小数
           arr_2.append(round(math.exp(x)/sum_e, 4))
       print("经过指数转换法(SoftMax)标准化后的数据为:\n{}".format(arr_2))
       
       arr_3 = list()
       for x in self.arr:
           # round(x, 4) 对x保留4位小数
           arr_3.append(round(1 / (1+math.exp(-x)), 4))
       print("经过指数转换法(Sigmoid)标准化后的数据为:\n{}".format(arr_3))

ob = DataNorm()
ob.Min_Max()
ob.Z_Score()
ob.DecimaScaling()
ob.Mean()
ob.Vector()
ob.exponential()

输出

经过Min_Max标准化后的数据为:
[0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0]
经过Z_Score标准化后的数据为:
[-1.5492, -1.1619, -0.7746, -0.3873, 0.0, 0.3873, 0.7746, 1.1619, 1.5492]
经过DecimaScaling标准化后的数据为:
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
经过Mean标准化后的数据为:
[-0.5, -0.375, -0.25, -0.125, 0.0, 0.125, 0.25, 0.375, 0.5]
经过Vector标准化后的数据为:
[0.0222, 0.0444, 0.0667, 0.0889, 0.1111, 0.1333, 0.1556, 0.1778, 0.2]
经过指数转换法(log10)标准化后的数据为:
[0.0, 0.3155, 0.5, 0.6309, 0.7325, 0.8155, 0.8856, 0.9464, 1.0]
经过指数转换法(SoftMax)标准化后的数据为:
[0.0002, 0.0006, 0.0016, 0.0043, 0.0116, 0.0315, 0.0856, 0.2326, 0.6322]
经过指数转换法(Sigmoid)标准化后的数据为:
[0.7311, 0.8808, 0.9526, 0.982, 0.9933, 0.9975, 0.9991, 0.9997, 0.9999]
  • 参考:《推荐系统开发实战》

你可能感兴趣的:(Python,python,机器学习)