【机器学习笔记】数据归一化

来源:互联网 发布:linux 删除多个文件夹 编辑:程序博客网 时间:2024/05/17 07:46

数据归一化

导语

在机器学习入门的过程中,我们经常见到在导入数据时,常常出现的一步操作叫做数据归一化(normalization),一开始我并不知道它的作用,甚至发现有些时候去掉数据归一化的步骤,代码一样可以运行,机器学习的结果甚至也是正确的,所以去调查了一番,什么是数据归一化,又到底是做什么的。

一、为什么要进行数据归一化

我们先观察下面的两个图像。 
这里写图片描述

要找到他们的梯度方向。如下图所示 
这里写图片描述
很显然是左侧的图像更容易去找,换作是机器学习之中,这一组数据更利于你的程序快速收敛。

往往我们需要进行学习和训练的一手数据都比较粗糙,大多都有着不同甚至是相差很大的量纲,这样就会出现右图中图像过“扁”的情况。这会导致学习过程中,收敛过慢甚至是不收敛的情况。

出于各种考虑,我们需要对数据进行处理,使我们的数据尽量处在相同的量纲,比如我们的x和y向量的数据经过处理后都处在[-1,1]的范围内。

二、数据归一化的基本方法

  • 线性归一化
  • 标准差归一化
  • 对数归一化
  • 反余切归一化
  • mapminmax

1.线性归一化

简单公式表达:y = (x-min Value)/(max Value-min Value) 
其中,x是归一化之前的数据,y是归一化之后的数据,max Value 和 min Value 分别对应这一组数据中的最大值和最小值。范围:[0,1]。 
适用于:把原来数据等比例缩放限定在某一范围内,在不涉及距离度量和协方差计算的时候使用。

2.标准差归一化

简单公式表达:y = (x-μ)/σ 
其中,x,y分别对应归一化前后数据。μ代表这组数据的均差,σ代表这组数据的方差。 
适用于:原来数据近似高斯分布。同时是距离度量的。

3.对数归一化

简单公示表达:y= log10(x) 
其中,x,y分别对应归一化前后数据。

4.反余切归一化

简单公示表达:y = atan(x)*2/pi 
其中,x,y分别对应归一化前后数据。反余切函数的范围在[0,π/2],因此对反余切得到的值乘2除π,把范围控制在[0,1]

5.mapminmax归一化

这是matlab中封装好的方法,是线性归一化的一种。 
表达式为:y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin 
其中,x,y分别对应归一化前后数据。xmax,xmin分别对应处理前数据的最大值和最小值,而ymax,ymin则是处理后的数据的最大值最小值,换言之,就是我们希望我们处理后的数据的范围。matlab中使用方式是,[matlab_minmax_data,s1] = mapminmax(minmax_data); 
matlab_minmax_data是处理后的矩阵,s1为mapminmax操作的索引,可以输出查看。minmax_data是处理前的数据。

三、简单matlab代码实现

%% 初始的数据部分% 未经处理的数据datadata = [1,3,9,20,2,6; ];% 获取数据的个数,也就是矩阵的列数。data_l=size(data,2);%% 进行线性函数归一化%分配内存空间minmax_data = zeros(1,data_l);for n=1:data_l   %当前的值减去最小值,再除以最大值最小值之差    minmax_data(:,n)=(data(:,n)-min(data))/(max(data)-min(data));end%输出结果disp('线性归一化');disp(minmax_data);%% 进行标准差归一化化%分配内存空间zscore_data = zeros(1,data_l);for m=1:data_l    %当前值减去均值,再除以标准差    zscore_data(:,m)=(data(:,m)-mean(data))/std(data);end%输出结果disp('标准差归一化');disp(zscore_data);%% 进行对数归一化% 分配内存空间log_data = zeros(1,data_l);for n=1:data_l    log_data(:,n)=log10(data(:,n));end% 输出结果disp('对数归一化');disp(log_data);%% 进行反余切归一化% 分配内存空间atan_data = zeros(1,data_l);for n=1:data_l    %反余切函数的范围在[0,π/2],因此对反余切得到的值乘2除π,把范围控制在[0,1]    atan_data(:,n)=atan(data(:,n))*2/pi;end%输出结果disp('反余切归一化');disp(atan_data);%% 进行mapminmax归一化[matlab_minmax_data,s1] = mapminmax(minmax_data);%输出结果disp('mapminmax归一化');disp(matlab_minmax_data);%输出归一化的索引disp('mapminmax归一化索引');disp(s1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

输出如下: 
这里写图片描述 
这里写图片描述

原创粉丝点击