常見的數據標准化方法有以下6種:
1、Min-Max標准化
Min-Max標准化是指對原始數據進行線性變換,將值映射到[0,1]之間
2、Z-Score標准化
Z-Score(也叫Standard Score,標准分數)標准化是指:基於原始數據的均值(mean)和標准差(standard deviation)來進行數據的標准化。
3、小數定標(Decimal scaling)標准化
小數定標標准化是指:通過移動小數點的位置來進行數據的標准化。小數點移動的位數取決於原始數據中的最大絕對值。
4、均值歸一化法
均值歸一化是指:通過原始數據中的均值、最大值和最小值來進行數據的標准化
5、向量歸一化
向量歸一化是指:通過用原始數據中的每個值除以所有數據之和來進行數據的標准化
6、指數轉換
指數轉換是指:通過對原始數據的值進行相應的指數函數變換來進行數據的標准化。進行指數轉換常見的函數方法有lg函數、Softmax函數和Sigmoid函數
實例1:實現數據的標准化
要對原始數據[1,2,3,4,5,6,7,8,9]進行標准化,代碼如下:
"""
Author: Thinkgamer
Desc:
代碼4-1 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 = 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()
在實現數據標准化中,使用round函數來進行小數后數據位數的保留,如round(x,4)表示的是保留小數點后4位小數