当前位置:   article > 正文

【深度学习】数据归一化/标准化 Normalization/Standardization_深度学习 归一化计算

深度学习 归一化计算

目录

一、实际问题

二、归一化 Normalization

三、归一化的类型

1. Min-max normalization (Rescaling)

2. Mean normalization

3.Z-score normalization (Standardization)

4.非线性归一化

4-1 对数归一化

4-2 反正切函数归一化

4-3 小数定标标准化(Demical Point Normalization)

四、如何选择归一化函数?

五、Java实现归一化工具类


一、实际问题

在数据分析、深度学习中,经常需要对数据进行处理,数据处理时,会发现一个问题:

不同维度的数据,数据范围偏差比较大,如

  • 距离地铁的距离——房价的关系
  • 海拔高度——氧气含量的关系

一个维度的数据范围大,一个小,导致以下问题:

【1】求解过程不平缓、函数收敛慢

【2】相关性展示不明显

如下图:

海拔越高、氧气含量越低,因为数据范围的原因,导致两者的相关性展示得不明显。

解决得方式就是归一化和标准化

二、归一化 Normalization

归一化,指将数据样本中的数据进行处理,使它们处于同一量级。

如 [0,1] 或者 [-1,1] 或者其它

归一化后,数据更具有可比性,如图

函数的求解过程也会比较平缓,更快求得最优解,如下图

左:未归一化的求解  右:归一化后的求解

三、归一化的类型

1. Min-max normalization (Rescaling)

最值归一化,公式如下:

\mathbf{​{x}'=\frac{x-min}{max-min}}

归一化后的数据范围为 [0, 1],其中min max分别求样本数据的最小值和最大值。

2. Mean normalization

均值归一化,公式如下:

\mathbf{​{x}'=\frac{x-mean}{max-min}}

归一化后的数据范围为 [-1, 1],其中mean、min、max为样本数据的平均值、最小值和最大值。

3.Z-score normalization (Standardization)

标准差归一化,也成为标准化(标准化其实就是归一化的一种),公式如下:

\boldsymbol{\mathbf{}\boldsymbol{\mathbf{}{x}'=\frac{x-mean}{\sigma}}}

归一化后的数据范围为实数集,其中mean、σ 分别为样本数据的均值和标准差。

4.非线性归一化

4-1 对数归一化

\boldsymbol{\mathbf{}{x}'=\frac{lg(x)}{lg(max)}}

4-2 反正切函数归一化

\boldsymbol{\mathbf{}{x}'=arctan(x)*\frac{2}{pi}}

归一化后的数据范围为 [-1, 1]

4-3 小数定标标准化(Demical Point Normalization)

\boldsymbol{\mathbf{}{x}'=\frac{x}{10^{j}}}

j为使

 \boldsymbol{\mathbf{}max(\left |{ x}' \right |)<1}

的最小整数,归一化后的数据范围为 [-1, 1]

四、如何选择归一化函数?

Min-Max归一化、Mean归一化适合

【1】最大最小值明确不变:如图像处理中,RGB值为0~255,可以使用Min-Max来处理。

【2】对数据范围有明确要求:如需要数据范围为-1~1

不适合:

【1】最大最小值不明确:每次有新的值加入,之前的结果就会发生改变,导致不稳定。

【2】有过大或过小的异常值存在:效果会较差

Z-score归一化适合:

【1】存在异常值、最大最小值不固定

缺点是:

【1】改变了数据的状态分布,但不会改变分布的种类:经过处理的数据呈均值为0,标准差为1的分布

非线性归一化适合

【1】数据分化程度较大的场景

五、Java实现归一化工具类

  1. package com.potato.commonpro.util.math;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * 数据样本归一化工具类
  6. * 包含了多个归一化函数,提供了List/Array两种类型的输入输出,具体的归一化函数如下:
  7. * 【1】min-max normalization(Rescaling)
  8. * 【2】mean normalization
  9. * 【3】Z-score normalization (Standardization)
  10. * 【4】对数归一化
  11. * 【5】反正切函数归一化
  12. * 【6】小数定标标准化
  13. * <p>
  14. * Author:PotatoChan
  15. * Date:2023-12-30
  16. */
  17. public class PotatoNormalization {
  18. /**
  19. * min-max normalization(Rescaling)
  20. * 归一化公式:x'=(x-min)/(max-min)
  21. * 归一化后的数据范围为 [0, 1],其中min 、max 分别求样本数据的最小值和最大值。
  22. *
  23. * @param data 数据样本
  24. * @return 归一化后的数据样本
  25. */
  26. public static List<Double> normalizationForMinToMax(List<Double> data) {
  27. List<Double> result = new ArrayList<>();
  28. //求取样本数据中的最大值与最小值
  29. double max = Double.MIN_VALUE;
  30. double min = Double.MAX_VALUE;
  31. for (Double item : data) {
  32. if (item > max) max = item;
  33. if (item < min) min = item;
  34. }
  35. //计算归一化后的数据
  36. double dis = max - min;
  37. for (Double item : data) {
  38. double num = (item - min) / dis;
  39. result.add(num);
  40. }
  41. return result;
  42. }
  43. /**
  44. * min-max normalization(Rescaling)
  45. * 归一化公式:x'=(x-min)/(max-min)
  46. * 归一化后的数据范围为 [0, 1],其中min 、max 分别求样本数据的最小值和最大值。
  47. *
  48. * @param data 数据样本
  49. * @return 归一化后的数据样本
  50. */
  51. public static double[] normalizationForMinToMax(double[] data) {
  52. double[] result = new double[data.length];
  53. //求取样本数据中的最大值与最小值
  54. double max = Double.MIN_VALUE;
  55. double min = Double.MAX_VALUE;
  56. for (Double item : data) {
  57. if (item > max) max = item;
  58. if (item < min) min = item;
  59. }
  60. //计算归一化后的数据
  61. double dis = max - min;
  62. for (int i = 0; i < data.length; i++) {
  63. result[i] = (data[i] - min) / dis;
  64. }
  65. return result;
  66. }
  67. /**
  68. * mean normalization
  69. * 归一化公式:x'=(x-mean)/(max-min)
  70. * 归一化后的数据范围为 [-1, 1],其中mean为样本数据的平均值,min 、max 分别求样本数据的最小值和最大值
  71. *
  72. * @param data 数据样本
  73. * @return 归一化后的数据样本
  74. */
  75. public static List<Double> normalizationForMean(List<Double> data) {
  76. List<Double> result = new ArrayList<>();
  77. //求取样本数据中的最大值与最小值、平均值
  78. double max = Double.MIN_VALUE;
  79. double min = Double.MAX_VALUE;
  80. double mean = 0;
  81. for (Double item : data) {
  82. if (item > max) max = item;
  83. if (item < min) min = item;
  84. mean += item;
  85. }
  86. mean = mean / data.size();
  87. //计算归一化后的数据
  88. double dis = max - min;
  89. for (Double item : data) {
  90. double num = (item - mean) / dis;
  91. result.add(num);
  92. }
  93. return result;
  94. }
  95. /**
  96. * mean normalization
  97. * 归一化公式:x'=(x-mean)/(max-min)
  98. * 归一化后的数据范围为 [-1, 1],其中mean为样本数据的平均值,min 、max 分别求样本数据的最小值和最大值
  99. *
  100. * @param data 数据样本
  101. * @return 归一化后的数据样本
  102. */
  103. public static double[] normalizationForMean(double[] data) {
  104. double[] result = new double[data.length];
  105. //求取样本数据中的最大值与最小值、平均值
  106. double max = Double.MIN_VALUE;
  107. double min = Double.MAX_VALUE;
  108. double mean = 0;
  109. for (Double item : data) {
  110. if (item > max) max = item;
  111. if (item < min) min = item;
  112. mean += item;
  113. }
  114. mean = mean / data.length;
  115. //计算归一化后的数据
  116. double dis = max - min;
  117. for (int i = 0; i < data.length; i++) {
  118. result[i] = (data[i] - mean) / dis;
  119. }
  120. return result;
  121. }
  122. /**
  123. * Z-score normalization (Standardization)
  124. * 归一化公式:x'=(x-mean)/σ
  125. * 归一化后的数据范围为实数集,其中μ、σ 分别为样本数据的均值和标准差
  126. *
  127. * @param data 数据样本
  128. * @return 归一化后的数据样本
  129. */
  130. public static List<Double> normalizationForZScore(List<Double> data) {
  131. List<Double> result = new ArrayList<>();
  132. //求取样本数据中的平均值
  133. double mean = 0;
  134. for (Double item : data) {
  135. mean += item;
  136. }
  137. mean = mean / data.size();
  138. //计算方差
  139. double variance = 0;
  140. for (Double item : data) {
  141. variance += (item - mean) * (item - mean);
  142. }
  143. variance = variance / data.size();
  144. //计算标准差
  145. double standardDeviation = Math.sqrt(variance);
  146. //计算归一化后的数据
  147. for (Double item : data) {
  148. double num = (item - mean) / standardDeviation;
  149. result.add(num);
  150. }
  151. return result;
  152. }
  153. /**
  154. * Z-score normalization (Standardization)
  155. * 归一化公式:x'=(x-mean)/σ
  156. * 归一化后的数据范围为实数集,其中μ、σ 分别为样本数据的均值和标准差
  157. *
  158. * @param data 数据样本
  159. * @return 归一化后的数据样本
  160. */
  161. public static double[] normalizationForZScore(double[] data) {
  162. double[] result = new double[data.length];
  163. //求取样本数据中的平均值
  164. double mean = 0;
  165. for (Double item : data) {
  166. mean += item;
  167. }
  168. mean = mean / data.length;
  169. //计算方差
  170. double variance = 0;
  171. for (Double item : data) {
  172. variance += (item - mean) * (item - mean);
  173. }
  174. variance = variance / data.length;
  175. //计算标准差
  176. double standardDeviation = Math.sqrt(variance);
  177. //计算归一化后的数据
  178. for (int i = 0; i < data.length; i++) {
  179. result[i] = (data[i] - mean) / standardDeviation;
  180. }
  181. return result;
  182. }
  183. /**
  184. * 对数归一化
  185. * 归一化公式:x'=ln(x)/ln(max)
  186. * 其中,max为数据样本的最大值
  187. *
  188. * @param data 数据样本
  189. * @return 归一化后的数据样本
  190. */
  191. public static List<Double> normalizationForlg(List<Double> data) {
  192. List<Double> result = new ArrayList<>();
  193. //求取样本数据中的最大值
  194. double max = Double.MIN_VALUE;
  195. for (Double item : data) {
  196. if (item > max) max = item;
  197. }
  198. //计算归一化后的数据
  199. for (Double item : data) {
  200. double num = Math.log10(item) / Math.log10(max);
  201. result.add(num);
  202. }
  203. return result;
  204. }
  205. /**
  206. * 对数归一化
  207. * 归一化公式:x'=ln(x)/ln(max)
  208. * 其中,max为数据样本的最大值
  209. *
  210. * @param data 数据样本
  211. * @return 归一化后的数据样本
  212. */
  213. public static double[] normalizationForlg(double[] data) {
  214. double[] result = new double[data.length];
  215. //求取样本数据中的最大值
  216. double max = Double.MIN_VALUE;
  217. for (Double item : data) {
  218. if (item > max) max = item;
  219. }
  220. //计算归一化后的数据
  221. for (int i = 0; i < data.length; i++) {
  222. result[i] = Math.log10(data[i]) / Math.log10(max);
  223. }
  224. return result;
  225. }
  226. /**
  227. * 反正切函数归一化
  228. * 归一化公式:x'=arctan(x)*(2/PI)
  229. * 归一化后的数据范围为 [-1, 1],PI表示圆周率Π
  230. *
  231. * @param data 数据样本
  232. * @return 归一化后的数据样本
  233. */
  234. public static List<Double> normalizationForArctan(List<Double> data) {
  235. List<Double> result = new ArrayList<>();
  236. //计算归一化后的数据
  237. for (Double item : data) {
  238. double num = Math.atan(item) * (2 / Math.PI);
  239. result.add(num);
  240. }
  241. return result;
  242. }
  243. /**
  244. * 反正切函数归一化
  245. * 归一化公式:x'=arctan(x)*(2/PI)
  246. * 归一化后的数据范围为 [-1, 1],PI表示圆周率Π
  247. *
  248. * @param data 数据样本
  249. * @return 归一化后的数据样本
  250. */
  251. public static double[] normalizationForArctan(double[] data) {
  252. double[] result = new double[data.length];
  253. //计算归一化后的数据
  254. for (int i = 0; i < data.length; i++) {
  255. result[i] = Math.atan(data[i]) * (2 / Math.PI);
  256. }
  257. return result;
  258. }
  259. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/670909
推荐阅读
相关标签
  

闽ICP备14008679号