使用Matlab对数据归一化

使用Matlab对数据归一化前言在使用机器学习做分类和回归分析时,往往需要对训练和测试数据首先做归一化处理。这里就对使用MATLAB对数据进行归一化方法做一个小总结。为什么进行归一化一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化。关于为什么进行归一化处理维基百科给出的解释是:1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度。具体介绍:https://w…

大家好,又见面了,我是你们的朋友全栈君。

前言

在使用机器学习做分类和回归分析时,往往需要对训练和测试数据首先做归一化处理。这里就对使用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+(upperlower)(ymin)/(maxmin)
其中,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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152292.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • S3C2440移植uboot之支持NAND启动

    S3C2440移植uboot之支持NAND启动上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动。

    2022年6月13日
    22
  • 生成对抗网络——GAN(一)「建议收藏」

    生成对抗网络——GAN(一)「建议收藏」Generativeadversarialnetwork据有关媒体统计:CVPR2018的论文里,有三分之一的论文与GAN有关!由此可见,GAN在视觉领域的未来多年内,将是一片沃土(CVer们是时候入门GAN了)。而发现这片矿源的就是GAN之父,Goodfellow大神。~~~生成对抗网络GAN,是当今的一大热门研究方向。在2014年,被Goodfellow大神提出来,当时的G…

    2025年7月9日
    3
  • pycharm使用技巧及常用快捷键_键盘怎么自定义改键

    pycharm使用技巧及常用快捷键_键盘怎么自定义改键PyCharm自身提供了大量实用的快捷键,但是由于自己之前其他软件的快捷键使用习惯与此不同,这就需要在PyCharm量身DIY属于自己的快捷键了。快来按照下面的流程操作吧!!!1、File—>Settings【Settings的快捷键大家看到了嘛!!!Ctrl+Alt+S】2、Keymap—>齿轮状设置—>Duplicate建议在设置快捷键之前…

    2022年8月25日
    5
  • kettle在linux定时任务_CentOS(Linux)安装KETTLE教程 并配置执行定时任务[通俗易懂]

    kettle在linux定时任务_CentOS(Linux)安装KETTLE教程 并配置执行定时任务[通俗易懂]1,首先是安装jdk,并设置环境变量采用yum安装可不设置环境变量2,下载kettlehttps://sourceforge.net/projects/pentaho/files/Data%20Integration/请选择我们当前工作的版本7.0可以使用如下命名直接下载wget-c–output-document=pdi-ce-7.0.0.0-25.ziphttps://nchc.dl….

    2022年5月23日
    40
  • oracle数据库创建user,Oracle数据库如何创建数据库用户呢?

    oracle数据库创建user,Oracle数据库如何创建数据库用户呢?摘要:下文讲述Oracle数据库中创建数据库用户的方法分享,如下所示;在oracle数据库中,当我们创建了相应的数据库后,通常我们会为数据库指定相应的用户,然后单独操作此数据库,下文讲述oracle数据库中创建数据库用户的方法分享实现思路:1.创建oracle用户前,需先创建表空间createtablespace表空间datafile’数据库文件名’size表空间大小如:SQL>…

    2022年7月14日
    19
  • php构建webservice,php webservice实例(简单易懂)「建议收藏」

    php构建webservice,php webservice实例(简单易懂)「建议收藏」phpwebservice实例(简单易懂)首先大家要简单了解了何谓webservice,接下来就做两个非常简单的例子,webservice还是逃不开server端与client端。我测试的环境为:apache2.2.11php5.2.10做这个测试之前,要确认你的php配置文件中已经将soap扩展打开,即extension=php_soap.dll;OK现在我们来体验webservice//…

    2022年7月21日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号