数据标准化的常见方法(Min-Max标准化、Z-Score标准化等)
推荐本人Github page: 点击这里
写在前面的话:
数据的标准化:
将数据按比例缩放,使之落入一个小的特定区间,一般目的在于:去除数据的单位限制,转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。数据的归一化便是一个典型的案例。
数据的归一化:
- 把数转换为(0,1)之间的小数
- 把有量纲的表达式转换为无量纲的表达式
归一化的好处:在多指标评价体系中,由于个评价指标的性质,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱值水平低指标的作用,因此,为了保证结果的可靠性,需要对原始数据进行标准化处理。
经验上来说,归一化就是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
1.1 数据标准化
-
Min-Max标准化
Min-Max标准化是指对原始数据进行线性变换,将值映射到[0,1]之间 -
Z-Score标准化
Z-Score标准化是指:基于原始数据的均值(mean)和标准差(standard deviation)来进行数据的标准化。其主要目的是将不同量级的数据统一化为同一个量级,统一用计算出的Z-Score值衡量,保证了数据间具有可比性。 -
小数定标(Decimal scaling)标准化
-
均值归一法(Mean normalization)
下图的 u是表示均值,value表示在一组数据中第i个元素的值
通过原始数据中的均值、最大值和最小值来进行数据标准化。(上述两条公式都是差不多的)
-
向量归一化
-
指数转换
指数转换是指:通过对原始数据进行相应的指数函数变换来进行数据的标准化。常见的指数转换函数方法如下所示:lg函数:
计算公式:
x为原始数据中的一个数据,Xmax表示原始数据中的最大值Softmax函数:
计算公式:
x ′ = e x / ∑ i = 1 n e x i x'=e^{x}/\sum^{n}_{i=1}{e^{x_i}} x′=ex/i=1∑nexi
x为原始数据中的一个数据,e为自然函数,分母表示的是原始数据中每个数据被e求指数后的和。分子表示的是原始数据中的一个数据被e求指数。Sigmoid函数:
计算公式:
x ′ = 1 / ( 1 + e − x ) x'=1/(1+e^{-x}) x′=1/(1+e−x)
同样,x为原始数据中的一个常数,e为自然常数。
1.2 实现
# -*-coding:utf-8-*-
import numpy as np
import math
'''
around(arr,decimals=?)?表示保留多少位小数
'''
class Datanorm:
def __init__(self):
self.arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
self.x_max = self.arr.max() #数组元素中的最大值
self.x_min = self.arr.min() #数组元素中的最小值
self.x_mean = self.arr.mean() # 数组元素中平均值
self.x_std = self.arr.std() #数组元素中的标准差
def Min_MaxNorm(self):
arr = np.around(((self.arr - self.x_min) / (self.x_max - self.x_min)), decimals=4)
print("Min_Max标准化:{}".format(arr))
def Z_ScoreNorm(self):
arr = np.around((self.arr - self.x_mean) / self.x_std, decimals=4)
print("Z_Score标准化:{}".format(arr))
def Decimal_ScalingNorm(self):
power = 1
maxValue = self.x_max
while maxValue / 10 >= 1.0:
power += 1
maxValue /= 10
arr = np.around((self.arr / pow(10, power)), decimals=4)
print("小数定标标准化:{}".format(arr))
def MeanNorm(self):
first_arr = np.around((self.arr-self.x_mean) / (self.x_max - self.x_min), decimals=4)
second_arr = np.around((self.arr - self.x_mean)/self.x_max, decimals=4)
print("均值归一法:\n公式一:{}\n公式二:{}".format(first_arr, second_arr))
def Vector(self):
arr = np.around((self.arr/self.arr.sum()), decimals=4)
print("向量归一法:{}".format(arr))
def exponeential(self):
first_arr = np.around(np.log10(self.arr) / np.log10(self.x_max), decimals=4)
second_arr = np.around(np.exp(self.arr)/sum(np.exp(self.arr)), decimals=4)
three_arr = np.around(1/(1+np.exp(-1*self.arr)), decimals=4)
print("lg函数:{}\nSoftmax函数:{}\nSigmoid函数:{}\n".format(first_arr,second_arr,three_arr))
if __name__ == "__main__":
a = Datanorm()
a.Min_MaxNorm()
a.Z_ScoreNorm()
a.Decimal_ScalingNorm()
a.MeanNorm()
a.Vector()
a.exponeential()
1.3 参考文献
1.数据的标准化
2. 《推荐系统开发实战》高阳团/编著
更多推荐
所有评论(0)