使用Matlab对数据归一化 您所在的位置:网站首页 matlab数据中心化 使用Matlab对数据归一化

使用Matlab对数据归一化

2024-05-31 00:27| 来源: 网络整理| 查看: 265

前言

在使用机器学习做分类和回归分析时,往往需要对训练和测试数据首先做归一化处理。这里就对使用MATLAB对数据进行归一化方法做一个小总结。

为什么进行归一化

一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化。关于为什么进行归一化处理维基百科给出的解释是:1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度。 具体介绍:https://www.cnblogs.com/davidwang456/articles/9729746.html

使用MATLAB归一化

对于模式识别或者其他统计学来说,训练数据和测试数据应该是每一列是一个样本,每一行是多个样本的同一维,即对于一个M*N的矩阵来说,样本的维度是M,一共N列N个样本。而对数据归一化也应该是对同一维的数据进行归一化。MATLAB提供了归一化函数mapminmax,其主要调用形式有:

1. [Y,PS] = mapminmax(X,YMIN,YMAX) 2. [Y,PS] = mapminmax(X,FP) 3. Y = mapminmax('apply',X,PS) 4. X = mapminmax('reverse',Y,PS)

对于1和2的调用形式来说,X是预处理的数据,Ymin和Ymax是期望的每一行的最小值与最大值,FP是一个结构体成员主要是FP.ymin, FP.ymax.这个结构体就可以代替Ymin和Ymax,1和2的处理效果一样,只不过参数的带入形式不同。不设置YMIN 和YMAX,归一化范围为0~1。 示例:

x=[2,3,4,5,6;7,8,9,10,11]; [Y,PS] = mapminmax(x,0,1); fp.ymin=0; fp.ymax=1; [Y,PS] = mapminmax(x,fp);

结果:

0 0.250000000000000 0.500000000000000 0.750000000000000 1 0 0.250000000000000 0.500000000000000 0.750000000000000 1

而对于3式,在模式识别或者统计学里,PS是训练样本的数据的映射,即PS中包含了训练数据的最大值和最小值,式中的X是测试样本,对于测试样本来说,预处理应该和训练样本一致,即测试样本的最大值和最小值应该是训练集的最大值与最小值。假设x是训练样本,y是测试样本,则代码如下: 示例:

x=[2,3,4,5,6;7,8,9,10,11]; y=[2,3;4,5]; [xx,ps]=mapminmax(x,0,1); yy=mapminmax('apply',y,ps)

但对于训练样本和测试样本,一般是将两者合起来一起归一化,例如要将train,test一起归一化:

[mtrain,ntrain]=size(train); [mtest,ntest]=size(test); dataset=[train;test]; [dataset_scale,ps]=mapminmax(dataset',0,1); train=dataset_scale(1:mtrain,:); test=dataset_scale((mtrain+1):(mtrain+mtest),:);

对于4式,是预处理之后的数据进行反转得到原始数据

x=[2,3,4,5,6;7,8,9,10,11]; y=[2,3;4,5]; [xx,ps]=mapminmax(x,0,1); yy=mapminmax('apply',y,ps); y=mapminmax('reverse',yy,ps) 归一化算法描述

y ′ = l o w e r + ( u p p e r − l o w e r ) ∗ ( y − m i n ) / ( m a x − m i n ) y'=lower+(upper-lower)*(y-min)/(max-min) y′=lower+(upper−lower)∗(y−min)/(max−min) 其中,y表示原始数据,y’表示经过归一化后的数据。

按列进行归一化

mapminmax函数默认是按行进行归一化的。当我们使用libsvm工具箱进行回归分析时,其数据组织要求一行表示一个样本数据,因此我们需要掌握如何使用mapminmax函数按列进行归一化的方法。

基于magic函数生成测试数据,假设有5个样本。

train = magic(5); 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9

假设第1列数据为因变量数据,第2、3、4和5列数据为自变量数据。每一列数据的属性相同,假设第1列数据表征身体的健康分数,2、3、4和5列是一些测量指标(如:体重、身高等)。在对数据进行归一化时,应该对每一列进行归一化,而不是将体重和升高一起进行归一化。 由于mapminmax只能按行进行归一化,因此,我们只需要对训练数据进行转置,然后进行归一化,归一化后再转置回来即可。

t = magic(5); % 训练数据 x = t'; % 转置 [y,ps] = mapminmax(x,0,1); % 归一化 tn = y'; % 转置

结果:

0.6842 1.0000 0 0.3158 0.6316 1.0000 0 0.2500 0.6316 0.6842 0 0.0526 0.5000 0.9474 1.0000 0.3158 0.3684 0.7500 1.0000 0 0.3684 0.6842 1.0000 0 0.3158

如果觉得上述方法不够简单,还可以使用下面的函数进行归一化: 描述

t = magic(5) scaleSVM(t,0,1) function out_scale = scaleSVM(c,lower,upper) % 设置归一化范围 [lower ,upper] % 按列进行归一化 [m,n]=size(c); %%获取行数m 和 列数 n Cmax=zeros(1,n); Cmin=zeros(1,n); for i=1:n Cmax(1,i)=max(c(:,i)); %%Cmax用来保存每一列中的最大值 end for i=1:n Cmin(1,i)=min(c(:,i)); %%Cmin用来保存每一列中的最小值 end for i=1:m for j=1:n c(i,j)=lower+(upper-lower)*(c(i,j)-Cmin(1,j))/(Cmax(1,j)-Cmin(1,j)); %%执行前述的公式进行归一化 end end out_scale=c; end

参考: https://www.mathworks.com/help/deeplearning/ref/mapminmax.html;jsessionid=8db547639f6ef5a379e2738db0ef https://blog.csdn.net/qq_22625309/article/details/76576184 https://www.cnblogs.com/litthorse/p/9276594.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有