归一化 / 规范化 / 标准化,是一种简化计算的方式,将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。能够提升模型的收敛速度,提升模型的精度。
主要看模型是否具有伸缩不变性。有些模型在各个维度进行不均匀伸缩后,最优解和原来不等价,例如SVM。对于这样的模型,除非本来各维数据的分布范围就比较接近,否则必须进行标准化,以免模型参数被分布范围较大或较小的数据支配。有些模型在各个维度进行不均匀伸缩后,最优解和原来等价,例如logistic regression(逻辑回归)。对于这样的模型,是否标准化理论上不会改变最优解。但是,由于实际求解往往使用迭代算法,如果目标函数的形状太扁,迭代算法可能收敛得很慢甚至不收敛。所以对于具有伸缩不变性的模型,最好也进行数据标准化。
比如对房屋售价进行预测时,特征有房屋面积和卧室数目,房屋面积有100平,而卧室数目为2或3,这样的情况会影响到数据分析的结果,如下右图,未进行标准化操作之前,房屋面积及卧室数量两个特征在数值上差异巨大,若直接将该样本送入训练,则代价函数的轮廓会是“扁长的”,在找到最优解前,梯度下降的过程不仅是曲折的,也是非常耗时的。
目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不同的标准化方法,对系统的评价结果会产生不同的影响,然而不幸的是,在数据标准化方法的选择上,还没有通用的法则可以遵循。
图像归一化处理
图像归一化最常见的就是最大最小值归一化方法,公式如下:
OpenCV中实现图像最大与最小值归一化的函数如下:
normalize(
src, // 表示输入图像, numpy类型
dst, // 表示归一化之后图像, numpy类型
alpha=None, // 归一化中低值 min
beta=None, // 归一化中的高值max
norm_type=None, // 归一化方法,选择最大最小值归一化 NORM_MINMAX,
dtype=None, // 归一化之后numpy数据类型,一般选择cv.CV_32F
mask=None // 遮罩层,默认设置为None
)
基于OpenCV实现图像最大最小值归一化的代码演示如下:
image = cv.imread("D:/javaopencv/dahlia_4.jpg")
cv.imshow("input", image)
result = np.zeros(image.shape, dtype=np.float32)
cv.normalize(image, result, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
print(result)
cv.imshow("norm", np.uint8(result*255.0))
cv.waitKey(0)
cv.destroyAllWindows()
原图像素值输出
归一化之后像素值:
解释
原图与归一化之后的运行结果完全一致,说明归一化不会改变图像本身的信息存储,但是通过打印出来的像素值可以发现,取值范围从0~255已经转化为0~1之间了,这个对于后续的神经网络或者卷积神经网络处理有很大的好处,tensorflow官方给出mnist数据集,全部采用了归一化之后的结果作为输入图像数据来演示神经网络与卷积神经网络。