在家没事梳理下数据标准化的东西,这数据预处理的基础东西,有大佬路过可以拿去跑一下,应该没有错误,下一篇讲数据离散化!
```# 数据标准化(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()