精华内容
下载资源
问答
  • Java之Normalizer(归一化)

    千次阅读 2021-03-10 06:01:02
    什么是归一化归一化的概念在人工智能领域会普通看到, 比如使用TensorFlow框架编码时,就会出现数据归一化的步骤或函数。简单来说, 归一化就是对一组数据进行转换,使这组数据具备相同的格式或特性。举例来说: ...

    什么是归一化?

    归一化的概念在人工智能领域会普通看到, 比如使用TensorFlow框架编码时,就会出现数据归一化的步骤或函数。

    简单来说, 归一化就是对一组数据进行转换,使这组数据具备相同的格式或特性。举例来说: 一组任意的整数数组:1,2,400,5000, 如果每个数都除以这组元素中的最大值的话(这里是5000),则这个数组元素的值位于0-1之间,满足数学上概率的值的区间。

    在AI中,对培训数据进行归一化的好处有:

    1、保持合适的样本间距

    以上面的示例来说, 1和5000相差甚远,如果以坐标图绘制,则相差的太远, 归一化之后就好多了。

    2、平等对待多个特征向量。

    有个例子示房子面积和房子的数量对房价的影响。面积的体量明显大于房子的数目,面积的因素很容易掩盖数量的影响。所以,归一化之后,更容易找到问题的解。

    归一化的数学方法

    归一化常见的数学方法有:

    线性归一化

    也称作(0,1)标准化 线性归一化 , Min-Max标准化和离差标准化。是对原始数据进行线性变换,变换后的结果值在0到1之间。

    公式是: X = (x-Min)/(Max-Min)

    均值标准差归一化

    使用均值和标准差进行数据的标准化。转换后的数据符合正态分布, 即均值为0, 标准差为1。

    公式是:X= x-均值/标准差

    Sigmoid函数归一化

    Java归一化类Normalizer

    JDK中提供了一个归一化类:java.text.Normalizer , 和传统的归一化有点区别, 这个类主要是对字符串编码的转换。从该类的包名也可以看出,这个类处理的是文本的数据。

    为什么会有编码的问题呢? 这个还要从计算机的原理说起, 计算机中使用1表示高电平,使用0表示低电平,简单点理解就是电源要么开,要么关。

    ASCII码应该是最早熟悉的字符编码了,(American Standard Code for Information Interchange): 美国信息交换标准代码,其实用的是8个比特位(1)个字节来表示拉丁字母以及一些特殊字符,但是8个比特位最多能有256种表示方式(比如0100 0001 表示大写的A, 换算成十进制是65,十六进制表示是0x41),但是汉字等有成千上百个,于是出现了 GB2312、GBK、Unicode等编码。

    Unicode(统一码、万国码、单一码),是业界统一的标准,该标准更多两个字节来表示字符(最多可以表示65536个字符)。 但这个标准又有不同的版本,比如UTF-8、UTF-16和UTF-32。同一个字符可能出现不同的编码方式。

    比如 á (小写a上面有一个第四声),就有两种编码方式:

    编码方式1:00C1 , 一个字符表示

    编码方式2:0041+0301 , 两个字符表示

    虽然同是á , 但是在Java中进行字符串匹配是不相同的, 所以需要进行归一化处理。 示例代码如下:

    public class NormalizerTest {

    // á

    @Test

    public void base() {

    // 归一化前

    String str1 = "\u00C1";

    System.out.println(str1);

    String str2 = "\u0041" + "\u0301";

    System.out.println(str2);

    // Assert.assertTrue(str1.equals(str2)); //失败

    // 归一化后

    str1 = Normalizer.normalize(str1, Normalizer.Form.NFC);

    str2 = Normalizer.normalize(str2, Normalizer.Form.NFC);

    System.out.println(str1);

    System.out.println(str2);

    Assert.assertTrue(str1.equals(str2)); // 成功

    }

    }

    normalize()方法有两个参数:

    第一个参数是需要归一化的字符串

    第二个参数是Unicode规范化的类型,该类型参数有四种:

    NFD 典型分解

    NFC 兼容性分解

    NFKD 规范分解,规范组成

    NFKC 兼容性分解,规范组成

    NF 是normalization-type的简写。

    类型细节参考:

    http://www.unicode.org/reports/tr15/tr15-23.html

    Java的Normalizer类的说明参考:

    https://docs.oracle.com/javase/7/docs/api/java/text/Normalizer.html

    展开全文
  • 数据归一化汇总

    2021-04-26 11:56:30
    y2(1) = 2(5-1)/(4-1)+(-1) = 5/3 = 1+2/3 = 1.66667 y2(2) = 2(2-1)/(4-1)+(-1) = -1/3 = -0.3333y2(3) = 2(3-1)/(4-1)+(-1) = 1/3 = 0.3333X = mapminmax('reverse',Y,PS)的作用就是进行反归一化,讲归一化的数据...

    ============外一篇 有关mapminmax的用法详解 by faruto==================================

    几个要说明的函数接口:

    [Y,PS] = mapminmax(X)

    [Y,PS] = mapminmax(X,FP)Y = mapminmax('apply',X,PS)X = mapminmax('reverse',Y,PS)

    用实例来讲解,测试数据 x1 = [1 2 4], x2 = [5 2 3];

    >> [y,ps] = mapminmax(x1)

    y =

    -1.0000   -0.3333    1.0000

    ps =

    name: 'mapminmax'

    xrows: 1

    xmax: 4

    xmin: 1

    xrange: 3

    yrows: 1

    ymax: 1

    ymin: -1

    yrange: 2

    其中y是对进行某种规范化后得到的数据,这种规范化的映射记录在结构体ps中.让我们来看一下这个规范化的映射到底是怎样的?

    Algorithm

    It is assumed that X has only finite real values, and that the elements of each row are not all equal.y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;

    [关于此算法的一个问题.算法的假设是每一行的元素都不想相同,那如果都相同怎么办?实现的办法是,如果有一行的元素都相同比如xt = [1 1 1],此时xmax = xmin = 1,把此时的变换变为y = ymin,matlab内部就是这么解决的.否则该除以0了,没有意义!]

    也就是说对x1 = [1 2 4]采用这个映射 f: 2*(x-xmin)/(xmax-xmin)+(-1),就可以得到y = [ -1.0000   -0.3333    1.0000]

    我们来看一下是不是: 对于x1而言 xmin = 1,xmax = 4;

    则y(1) = 2*(1 - 1)/(4-1)+(-1) = -1;

    y(2) = 2*(2 - 1)/(4-1)+(-1) = -1/3 = -0.3333;

    y(3) = 2*(4-1)/(4-1)+(-1) = 1;

    看来的确就是这个映射来实现的.

    对于上面algorithm中的映射函数 其中ymin,和ymax是参数,可以自己设定,默认为-1,1;

    比如:

    >>[y,ps] = mapminmax(x1)>> ps.ymin = 0;

    >> [y,ps] = mapminmax(x1,ps)

    y =

    0    0.3333    1.0000

    ps =

    name: 'mapminmax'

    xrows: 1

    xmax: 4

    xmin: 1

    xrange: 3

    yrows: 1

    ymax: 1

    ymin: 0

    yrange: 1

    则此时的映射函数为: f: 1*(x-xmin)/(xmax-xmin)+(0),是否是这样的这回你可自己验证.O(∩_∩)O

    如果我对x1 = [1 2 4]采用了某种规范化的方式, 现在我要对x2 = [5 2 3]采用同样的规范化方式[同样的映射],如下可办到:>> [y1,ps] = mapminmax(x1);

    >> y2 = mapminmax('apply',x2,ps)y2 =

    1.6667   -0.3333    0.3333

    即对x1采用的规范化映射为: f: 2*(x-1)/(4-1)+(-1),(记录在ps中),对x2也要采取这个映射.

    x2 = [5,2,3],用这个映射我们来算一下.

    y2(1) = 2(5-1)/(4-1)+(-1) = 5/3 = 1+2/3 = 1.66667

    y2(2) = 2(2-1)/(4-1)+(-1) = -1/3 = -0.3333y2(3) = 2(3-1)/(4-1)+(-1) = 1/3 = 0.3333X = mapminmax('reverse',Y,PS)的作用就是进行反归一化,讲归一化的数据反归一化再得到原来的数据:

    >> [y1,ps] = mapminmax(x1);

    >> xtt = mapminmax('reverse',y1,ps)

    xtt =

    1     2     4

    此时又得到了原来的x1(xtt = x1);=================================Matlab数字归一化问题(by yingzhilian)

    https://www.ilovematlab.cn/viewthread.php?tid=26409&extra=page%3D1&sid=Xs3tJM

    -------------------------------------------------------

    归一化化定义:我是这样认为的,归一化化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快。

    在matlab里面,用于归一化的方法共有三种:(1)premnmx、postmnmx、tramnmx(2)prestd、poststd、trastd(3)是用matlab语言自己编程。

    premnmx指的是归一到[-1 1],prestd归一到单位方差和零均值。(3)关于自己编程一般是归一到[0.1  0.9]。具体用法见下面实例。

    为什么要用归一化呢?首先先说一个概念,叫做奇异样本数据,所谓奇异样本数据数据指的是相对于其他输入样本特别大或特别小的样本矢量。

    下面举例:

    m=[0.11 0.15 0.32 0.45 30;

    0.13 0.24 0.27 0.25 45];其中的第五列数据相对于其他4列数据就可以成为奇异样本数据(下面所说的网络均值bp)。奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛,所以对于训练样本存在奇异样本数据的数据集在训练之前,最好先进形归一化,若不存在奇异样本数据,则不需要事先归一化。

    具体举例:

    close all

    clear

    echo on

    clc

    %BP建模

    %原始数据归一化m_data=[1047.92 1047.83 0.39 0.39 1.0 3500 5075;

    1047.83 1047.68 0.39 0.40  1.0 3452 4912;

    1047.68 1047.52  0.40  0.41 1.0  3404 4749;

    1047.52  1047.27  0.41  0.42 1.0  3356 4586;

    1047.27  1047.41 0.42 0.43  1.0  3308  4423;

    1046.73  1046.74 1.70 1.80 0.75  2733  2465;

    1046.74  1046.82  1.80  1.78 0.75  2419 2185;

    1046.82 1046.73  1.78  1.75  0.75 2105  1905;

    1046.73  1046.48 1.75 1.85 0.70 1791  1625;

    1046.48  1046.03  1.85  1.82  0.70 1477 1345;

    1046.03 1045.33 1.82 1.68  0.70  1163  1065;

    1045.33  1044.95  1.68  1.71 0.70  849  785;

    1044.95  1045.21 1.71  1.72  0.70  533  508;

    1045.21 1045.64  1.72  1.70 0.70 567  526;

    1045.64 1045.44 1.70  1.69  0.70  601  544;

    1045.44 1045.78  1.69  1.69 0.70  635  562;

    1045.78 1046.20  1.69  1.52 0.75  667  580];

    %定义网络输入p和期望输出t

    pause

    clc

    p1=m_data(:,1:5);

    t1=m_data(:,6:7);

    p=p1';t=t1';

    [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t)

    %设置网络隐单元的神经元数(5~30验证后5个最好)n=5;

    %建立相应的BP网络

    pause

    clc

    net=newff(minmax(pn),[n,2],{'tansig','purelin'},'traingdm');

    inputWeights=net.IW{1,1};

    inputbias=net.b{1};

    layerWeights=net.IW{1,1};

    layerbias=net.b{2};

    pause

    clc

    %训练网络

    net.trainParam.show=50;

    net.trainParam.lr=0.05;

    net.trainParam.mc=0.9;

    net.trainParam.epochs=200000;

    net.trainParam.goal=1e-3;

    pause

    clc

    %调用TRAINGDM算法训练BP网络

    net=train(net,pn,tn);

    %对BP网络进行仿真

    A=sim(net,pn);

    E=A-tn;

    M=sse(E)

    N=mse(E)

    pause

    clc

    p2=[1046.20 1046.05 1.52 1.538 0.75;

    1046.05 1046.85 1.538 1.510 0.75;

    1046.85 1046.60 1.510 1.408 0.75;

    1046.60 1046.77 1.408 1.403 0.75;

    1046.77 1047.18 1.403 1.319 0.75];

    p2=p2';

    p2n=tramnmx(p2,minp,maxp);

    a2n=sim(net,p2n);

    a2=postmnmx(a2n,mint,maxt)

    echo off

    pause

    clc程序说明:所用样本数据(见m_data)包括输入和输出数据,都先进行归一化,还有一个问题就是你要进行预测的样本数据(见本例p2)在进行仿真前,必须要用tramnmx函数进行事先归一化处理,然后才能用于预测,最后的仿真结果要用postmnmx进行反归一,这时的输出数据才是您所需要的预测结果。

    个人认为:tansig、purelin、logsig是网络结构的传递函数,本身和归一化没什么直接关系,归一化只是一种数据预处理方法。

    ==================================================================================需要说明的事并不是任何问题都必须事先把原始数据进行规范化,也就是数据规范化这一步并不是必须要做的,要具体问题具体看待,测试表明有时候规范化后的预测准确率比没有规范化的预测准确率低很多.就最大最小值法而言,当你用这种方式将原始数据规范化后,事实上意味着你承认了一个假设就是测试数据集的每一模式的所有特征分量的最大值(最小值)不会大于(小于)训练数据集的每一模式的所有特征分量的最大值(最小值),但这条假设显然过于强,实际情况并不一定会这样.使用平均数方差法也会有同样类似的问题.故数据规范化这一步并不是必须要做的,要具体问题具体看待.   [faruto按]

    实现上面的规范化代码:

    function normal = normalization(x,kind)

    % by Li Yang BNU MATH Email:farutoliyang@gmail.com QQ:516667408

    % last modified 2009.2.24

    %

    if nargin < 2

    kind = 2;%kind = 1 or 2 表示第一类或第二类规范化

    end

    [m,n]  = size(x);

    normal = zeros(m,n);

    %% normalize the data x to [0,1]

    if kind == 1

    for i = 1:m

    ma = max( x(i,:) );

    mi = min( x(i,:) );

    normal(i,:) = ( x(i,:)-mi )./( ma-mi );

    end

    end

    %% normalize the data x to [-1,1]

    if kind == 2

    for i = 1:m

    mea = mean( x(i,:) );

    va = var( x(i,:) );

    normal(i,:) = ( x(i,:)-mea )/va;

    end

    end复制代码

    ====================================================

    ==================

    关于神经网络(matlab)归一化的整理(by strongbox)

    https://www.ilovematlab.cn/viewthread.php?tid=12186

    ----------------------------------------------------------------------

    由于采集的各数据单位不一致,因而须对数据进行[-1,1]归一化处理,归一化方法主要有如下几种,供大家参考:(by james)

    1、线性函数转换,表达式如下:

    y=(x-MinValue)/(MaxValue-MinValue)

    说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。

    2、对数函数转换,表达式如下:

    y=log10(x)

    说明:以10为底的对数函数转换。

    3、反余切函数转换,表达式如下:

    y=atan(x)*2/PI

    归一化是为了加快训练网络的收敛性,可以不进行归一化处理

    归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布;

    当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。

    归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9 0.1 0.1]就要比用[1 0 0]要好。

    但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。

    关于用premnmx语句进行归一化:

    premnmx语句的语法格式是:[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T)

    其中P,T分别为原始输入和输出数据,minp和maxp分别为P中的最小值和最大值。mint和maxt分别为T的最小值和最大值。

    premnmx函数用于将网络的输入数据或输出数据进行归一化,归一化后的数据将分布在[-1,1]区间内。

    我们在训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx。

    下面介绍tramnmx函数:

    [Pn]=tramnmx(P,minp,maxp)

    其中P和Pn分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。

    (by terry2008)

    matlab中的归一化处理有三种方法

    1. premnmx、postmnmx、tramnmx

    2. restd、poststd、trastd

    3.自己编程

    具体用那种方法就和你的具体问题有关了

    (by happy)

    pm=max(abs(p(i,:))); p(i,:)=p(i,:)/pm;

    for i=1:27

    p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));

    end可以归一到0 1之间

    0.1+(x-min)/(max-min)*(0.9-0.1)其中max和min分别表示样本最大值和最小值。

    这个可以归一到0.1-0.9

    =================================by  ratbaby

    补充一个吧, 归一还可以用 mapminmax。

    这个函数可以把矩阵的每一行归一到[-1 1].

    [y1,PS] = mapminmax(x1). 其中x1 是需要归一的矩阵 y1是结果

    当需要对另外一组数据做归一时,比如SVM 中的 training data用以上方法归一,而test data就可以用下面的方法做相同的归一了

    y2 = mapminmax('apply',x2,PS)

    当需要把归一的数据还原时,可以用以下命令

    x1_again = mapminmax('reverse',y1,PS)

    =================================

    [本帖最后由 faruto 于 2009-8-16 07:13 编辑]

    展开全文
  • y2(1) = 2(5-1)/(4-1)+(-1) = 5/3 = 1+2/3 = 1.66667 y2(2) = 2(2-1)/(4-1)+(-1) = -1/3 = -0.3333 y2(3) = 2(3-1)/(4-1)+(-1) = 1/3 = 0.3333 复制代码 X = mapminmax('reverse',Y,PS)的作用就是进行反归一化,讲...

    ==================================================

    几个要说明的函数接口:

    [Y,PS] = mapminmax(X)

    [Y,PS] = mapminmax(X,FP)

    Y = mapminmax('apply',X,PS)

    X = mapminmax('reverse',Y,PS)

    复制代码

    用实例来讲解,测试数据

    x1 = [1 2 4], x2 = [5 2 3];

    >> [y,ps] = mapminmax(x1)

    y =

    -1.0000   -0.3333    1.0000

    ps =

    name: 'mapminmax'

    xrows: 1

    xmax: 4

    xmin: 1

    xrange: 3

    yrows: 1

    ymax: 1

    ymin: -1

    yrange: 2

    复制代码

    其中y是对进行某种规范化后得到的数据,这种规范化的映射记录在结构体ps中.让我们来看一下这个规范化的映射到底是怎样的?

    Algorithm

    It is assumed that X has only finite real values, and that the elements of each row are not all equal.

    * y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;

    复制代码

    * [关于此算法的一个问题.算法的假设是每一行的元素都不想相同,那如果都相同怎么办?实现的办法是,如果有一行的元素都相同比如xt = [1 1 1],此时xmax = xmin = 1,把此时的变换变为y = ymin,matlab内部就是这么解决的.否则该除以0了,没有意义!]

    也就是说对x1 = [1 2 4]采用这个映射 f: 2*(x-xmin)/(xmax-xmin)+(-1),就可以得到y = [ -1.0000   -0.3333    1.0000]

    我们来看一下是不是: 对于x1而言 xmin = 1,xmax = 4;

    则y(1) = 2*(1 - 1)/(4-1)+(-1) = -1;

    y(2) = 2*(2 - 1)/(4-1)+(-1) = -1/3 = -0.3333;

    y(3) = 2*(4-1)/(4-1)+(-1) = 1;

    看来的确就是这个映射来实现的.

    对于上面algorithm中的映射函数 其中ymin,和ymax是参数,可以自己设定,默认为-1,1;

    比如:

    >>[y,ps] = mapminmax(x1)

    >> ps.ymin = 0;

    >> [y,ps] = mapminmax(x1,ps)

    y =

    0    0.3333    1.0000

    ps =

    name: 'mapminmax'

    xrows: 1

    xmax: 4

    xmin: 1

    xrange: 3

    yrows: 1

    ymax: 1

    ymin: 0

    yrange: 1

    复制代码

    则此时的映射函数为: f: 1*(x-xmin)/(xmax-xmin)+(0),是否是这样的这回你可自己验证.O(∩_∩)O

    如果我对x1 = [1 2 4]采用了某种规范化的方式, 现在我要对x2 = [5 2 3]采用同样的规范化方式[同样的映射],如下可办到:

    >> [y1,ps] = mapminmax(x1);

    >> y2 = mapminmax('apply',x2,ps)

    y2 =

    1.6667   -0.3333    0.3333

    复制代码

    即对x1采用的规范化映射为: f: 2*(x-1)/(4-1)+(-1),(记录在ps中),对x2也要采取这个映射.

    x2 = [5,2,3],用这个映射我们来算一下.

    y2(1) = 2(5-1)/(4-1)+(-1) = 5/3 = 1+2/3 = 1.66667

    y2(2) = 2(2-1)/(4-1)+(-1) = -1/3 = -0.3333

    y2(3) = 2(3-1)/(4-1)+(-1) = 1/3 = 0.3333

    复制代码

    X = mapminmax('reverse',Y,PS)的作用就是进行反归一化,讲归一化的数据反归一化再得到原来的数据:

    >> [y1,ps] = mapminmax(x1);

    >> xtt = mapminmax('reverse',y1,ps)

    xtt =

    1     2     4

    复制代码

    此时又得到了原来的x1(xtt = x1);

    =================================

    Matlab 数字归一化问题(by yingzhilian)

    https://www.ilovematlab.cn/viewth ... %3D1&sid=Xs3tJM

    -------------------------------------------------------

    归一化化定义:我是这样认为的,归一化化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快。

    在matlab里面,用于归一化的方法共有三种:

    (1)premnmx、postmnmx、tramnmx

    (2)prestd、poststd、trastd

    (3)是用matlab语言自己编程。

    premnmx指的是归一到[-1 1],prestd归一到单位方差和零均值。(3)关于自己编程一般是归一到[0.1  0.9] 。具体用法见下面实例。

    为什么要用归一化呢?首先先说一个概念,叫做奇异样本数据,所谓奇异样本数据数据指的是相对于其他输入样本特别大或特别小的样本矢量。

    下面举例:

    m=[0.11 0.15 0.32 0.45 30;

    0.13 0.24 0.27 0.25 45];

    复制代码

    其中的第五列数据相对于其他4列数据就可以成为奇异样本数据(下面所说的网络均值bp)。奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛,所以对于训练样本存在奇异样本数据的数据集在训练之前,最好先进形归一化,若不存在奇异样本数据,则不需要事先归一化。

    具体举例:

    close all

    clear

    echo on

    clc

    %BP建模

    %原始数据归一化

    m_data=[1047.92 1047.83 0.39 0.39 1.0 3500 5075;

    1047.83 1047.68 0.39 0.40  1.0 3452 4912;

    1047.68 1047.52  0.40  0.41 1.0  3404 4749;

    1047.52  1047.27  0.41  0.42 1.0  3356 4586;

    1047.27  1047.41 0.42 0.43  1.0  3308  4423;

    1046.73  1046.74 1.70 1.80 0.75  2733  2465;

    1046.74  1046.82  1.80  1.78 0.75  2419 2185;

    1046.82 1046.73  1.78  1.75  0.75 2105  1905;

    1046.73  1046.48 1.75 1.85 0.70 1791  1625;

    1046.48  1046.03  1.85  1.82  0.70 1477 1345;

    1046.03 1045.33 1.82 1.68  0.70  1163  1065;

    1045.33  1044.95  1.68  1.71 0.70  849  785;

    1044.95  1045.21 1.71  1.72  0.70  533  508;

    1045.21 1045.64  1.72  1.70 0.70 567  526;

    1045.64 1045.44 1.70  1.69  0.70  601  544;

    1045.44 1045.78  1.69  1.69 0.70  635  562;

    1045.78 1046.20  1.69  1.52 0.75  667  580];

    %定义网络输入p和期望输出t

    pause

    clc

    p1=m_data(:,1:5);

    t1=m_data(:,6:7);

    p=p1';t=t1';

    [pn,minp,maxp,tn,mint,maxt]=premnmx(p,t)

    %设置网络隐单元的神经元数(5~30验证后5个最好)

    n=5;

    %建立相应的BP网络

    pause

    clc

    net=newff(minmax(pn),[n,2],{'tansig','purelin'},'traingdm');

    inputWeights=net.IW{1,1};

    inputbias=net.b{1};

    layerWeights=net.IW{1,1};

    layerbias=net.b{2};

    pause

    clc

    % 训练网络

    net.trainParam.show=50;

    net.trainParam.lr=0.05;

    net.trainParam.mc=0.9;

    net.trainParam.epochs=200000;

    net.trainParam.goal=1e-3;

    pause

    clc

    %调用TRAINGDM算法训练BP网络

    net=train(net,pn,tn);

    %对BP网络进行仿真

    A=sim(net,pn);

    E=A-tn;

    M=sse(E)

    N=mse(E)

    pause

    clc

    p2=[1046.20 1046.05 1.52 1.538 0.75;

    1046.05 1046.85 1.538 1.510 0.75;

    1046.85 1046.60 1.510 1.408 0.75;

    1046.60 1046.77 1.408 1.403 0.75;

    1046.77 1047.18 1.403 1.319 0.75];

    p2=p2';

    p2n=tramnmx(p2,minp,maxp);

    a2n=sim(net,p2n);

    a2=postmnmx(a2n,mint,maxt)

    echo off

    pause

    clc

    复制代码

    程序说明:所用样本数据(见m_data)包括输入和输出数据,都先进行归一化,还有一个问题就是你要进行预测的样本数据(见本例p2)在进行仿真前,必须要用tramnmx函数进行事先归一化处理,然后才能用于预测,最后的仿真结果要用postmnmx进行反归一,这时的输出数据才是您所需要的预测结果。

    个人认为:tansig、purelin、logsig是网络结构的传递函数,本身和归一化没什么直接关系,归一化只是一种数据预处理方法。

    ==================================================================================

    需要说明的事并不是任何问题都必须事先把原始数据进行规范化,也就是数据规范化这一步并不是必须要做的,要具体问题具体看待,测试表明有时候规范化后的预测准确率比没有规范化的预测准确率低很多.就最大最小值法而言,当你用这种方式将原始数据规范化后,事实上意味着你承认了一个假设就是测试数据集的每一模式的所有特征分量的最大值(最小值)不会大于(小于)训练数据集的每一模式的所有特征分量的最大值(最小值),但这条假设显然过于强,实际情况并不一定会这样.使用平均数方差法也会有同样类似的问题.故数据规范化这一步并不是必须要做的,要具体问题具体看待.   [faruto 按]

    实现上面的规范化代码:

    复制内容到剪贴板

    代码:

    function normal = normalization(x,kind)

    % by Li Yang BNU MATH Email:farutoliyang@gmail.com QQ:516667408

    % last modified 2009.2.24

    %

    if nargin < 2

    kind = 2;%kind = 1 or 2 表示第一类或第二类规范化

    end

    [m,n]  = size(x);

    normal = zeros(m,n);

    %% normalize the data x to [0,1]

    if kind == 1

    for i = 1:m

    ma = max( x(i,:) );

    mi = min( x(i,:) );

    normal(i,:) = ( x(i,:)-mi )./( ma-mi );

    end

    end

    %% normalize the data x to [-1,1]

    if kind == 2

    for i = 1:m

    mea = mean( x(i,:) );

    va = var( x(i,:) );

    normal(i,:) = ( x(i,:)-mea )/va;

    end

    end

    复制代码

    ==========================================================================

    由于采集的各数据单位不一致,因而须对数据进行[-1,1]归一化处理,归一化方法主要有如下几种,供大家参考:(by james)

    1、线性函数转换,表达式如下:

    y=(x-MinValue)/(MaxValue-MinValue)

    说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。

    2、对数函数转换,表达式如下:

    y=log10(x)

    说明:以10为底的对数函数转换。

    3、反余切函数转换,表达式如下:

    y=atan(x)*2/PI

    归一化是为了加快训练网络的收敛性,可以不进行归一化处理

    归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布;

    当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。

    归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9 0.1 0.1]就要比用[1 0 0]要好。

    但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。

    关于用premnmx语句进行归一化:

    premnmx语句的语法格式是:[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T)

    其中P,T分别为原始输入和输出数据,minp和maxp分别为P中的最小值和最大值。mint和maxt分别为T的最小值和最大值。

    premnmx函数用于将网络的输入数据或输出数据进行归一化,归一化后的数据将分布在[-1,1]区间内。

    我们在训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx。

    下面介绍tramnmx函数:

    [Pn]=tramnmx(P,minp,maxp)

    其中P和Pn分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。

    (by terry2008)

    matlab中的归一化处理有三种方法

    1. premnmx、postmnmx、tramnmx

    2. restd、poststd、trastd

    3. 自己编程

    具体用那种方法就和你的具体问题有关了

    (by happy)

    pm=max(abs(p(i,:))); p(i,:)=p(i,:)/pm;

    for i=1:27

    p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));

    end 可以归一到0 1 之间

    0.1+(x-min)/(max-min)*(0.9-0.1)其中max和min分别表示样本最大值和最小值。

    这个可以归一到0.1-0.9

    =================================by  ratbaby

    补充一个吧, 归一还可以用 mapminmax。

    这个函数可以把矩阵的每一行归一到[-1 1].

    [y1,PS] = mapminmax(x1). 其中x1 是需要归一的矩阵 y1是结果

    当需要对另外一组数据做归一时,比如SVM 中的 training data用以上方法归一,而test data就可以用下面的方法做相同的归一了

    y2 = mapminmax('apply',x2,PS)

    当需要把归一的数据还原时,可以用以下命令

    x1_again = mapminmax('reverse',y1,PS)

    展开全文
  • 数组归一化 将数组标准化为单位长度,即0..1范围。 请参阅。 const normalize = require ( 'array-normalize' ) normalize ( [ 0 , 50 , 100 ] ) // [0, .5, 1] normalize ( [ 0 , 0 , .1 , .2 , 1 , 2 ] , 2 ) //...
  • IDL程序实现NDBI归一化建成区指数计算; envi5.3 主要使用ENVI_DOIT,'math_doit'
  • Tensorflow2实现像素归一化与频谱归一化

    千次阅读 多人点赞 2021-07-10 15:42:59
    归一化技术的改进是生成对抗网络(Generative Adversarial Networks, GAN)中众多改进的一种,本文介绍常用于当前GAN中的像素归一化(Pixel normalization, 或称为像素规范化)和频谱归一化(Spectral normalization, 或...

    前言

    归一化技术的改进是生成对抗网络(Generative Adversarial Networks, GAN)中众多改进的一种,本文介绍常用于当前GAN中的像素归一化(Pixel normalization,或称为像素规范化)和频谱归一化(Spectral normalization,或称频谱规范化),在高清图片生成中,这两种归一化技术得到了广泛使用,最后使用Tensorflow2实现像素归一化和频谱归一化。

    像素归一化

    像素归一化详解

    像素归一化是在ProGAN模型中提出的,ProGAN的作者放弃了批归一化,并为生成器使用了自定义归一化,即像素归一化。
    在ProGAN中进行归一化的目的是限制权重值,以防止其呈指数增长。较大的权重可能会增大信号幅度,并导致生成器与鉴别器之间的恶性竞争。像素归一化将通道尺寸中每个像素位置(H, W)的特征进行归一化。如果张量是大小为(N, H, W, C)的批RGB图像,则像素归一化后任何像素的RGB矢量的大小将均为1。

    像素归一化实现

    在Tensorflow2中,可以使用自定义层来实现像素归一化:

    from tensorflow.keras.layers import Layer
    class PixelNorm(Layer):
        def __init__(self, epsilon=1e-8):
            super(PixelNorm, self).__init__()
            self.epsilon = epsilon
        
        def call(self, input_tensor):
            return input_tensor / tf.math.sqrt(tf.reduce_mean(input_tensor ** 2, axis=-1, keepdims=True) + self.epsilon)
    

    与其他归一化不同,像素归一化没有任何可学习的参数。它仅由简单的算术运算组成,因此计算效率很高。

    频谱归一化

    频谱归一化详解

    为了解释频谱归一化,首先需要复习下线性代数的知识,以大致解释什么是频谱范数。
    首先温故下矩阵理论中的特征值和特征向量:
    A v = λ v Av=\lambda v Av=λv
    其中 A A A是一个方阵, v v v是特征向量,而 λ \lambda λ是其特征值。
    我们将使用一个简单的示例来理解这些术语。假设 v v v是关于位置 ( x , y ) (x, y) (x,y)的向量,而 A A A是线性变换:
    A = ( a b c d ) , v = ( x y ) A=\begin{pmatrix} a & b\\ c & d\\ \end{pmatrix},v=\begin{pmatrix} x \\ y \\ \end{pmatrix} A=(acbd),v=(xy)
    如果将 A A A乘以 v v v,我们将获得一个新的位置,其方向改变如下:
    A v = ( a b c d ) × ( x y ) = ( a x + b y c x + d y ) Av=\begin{pmatrix} a & b\\ c & d\\ \end{pmatrix}\times \begin{pmatrix} x \\ y \\ \end{pmatrix}=\begin{pmatrix} ax + by\\ cx + dy\\ \end{pmatrix} Av=(acbd)×(xy)=(ax+bycx+dy)
    特征向量是将A应用于向量时不会改变方向的向量。取而代之的是,它们可以仅通过标量特征值 λ \lambda λ进行缩放。可以有多个特征向量—特征值对。最大特征值的平方根是矩阵的谱范数。对于非方矩阵,我们将需要使用数学算法(例如奇异值分解(singular value decomposition, SVD))来计算特征值,这在计算上可能会非常昂贵。
    因此,采用幂迭代法可以加快计算速度,使其对于神经网络训练具有可行性。接下来,在TensorFlow中实现频谱归一化作为权重约束。

    频谱归一化实现

    频谱归一化数学算法可能看起来很复杂。但是,通常,算法实现比数学上看起来更简单。
    以下是执行频谱归一化的步骤:

    1. 卷积层中的权重是一个4维张量,因此第一步是将其重塑为2D矩阵,在这里我们保留权重的最后一个维度。重塑后,权重的形状为(H×W, C)
    2. N ( 0 , 1 ) N(0,1) N(0,1)初始化向量 u u u
    3. for循环中,计算以下内容:
      a) 用矩阵转置和矩阵乘法计算 v = ( w T ) u v =(w^T)u v=(wT)u
      b) 用其 L 2 L_2 L2范数归一化 v v v,即 v = v / ∣ ∣ v ∣ ∣ 2 v = v/||v||_2 v=v/v2
      c) 计算 u = w v u = wv u=wv
      d) 用 L 2 L_2 L2范数归一化 u u u,即 u = u / ∣ ∣ u ∣ ∣ 2 u = u/||u||_2 u=u/u2
    4. 计算频谱范数为 u T w v u^Twv uTwv
    5. 最后,将权重除以频谱范数。

    完整的代码如下:

    import tensorflow as tf
    class SpectralNorm(tf.keras.constraints.Constraint):
        def __init__(self, n_iter=5):
            self.n_iter = n_iter
        def call(self, input_weights):
            w = tf.reshape(input_weights, (-1, input_weights.shape[-1]))
            u = tf.random.normal((w.shape[0], 1))
            for _ in range(self.n_iter):
                v = tf.matmul(w, u, transpose_a=True)
                v /= tf.norm(v)
                u = tf.matmul(w, v)
                u /= tf.norm(u)
            spec_norm = tf.matmul(u, tf.matmul(w, v),    transpose_a=True)
            return input_weights/spec_norm
    

    迭代次数是一个超参数,一般情况下5次就足够了。频谱归一化也可以实现为具有一个变量来保存向量 u u u,而不是从随机值开始。这会将迭代次数减少到1。实现频谱归一化,我们可以通过将其用作卷积核约束来应用频谱归一化,如:

    Conv2D(3,1,kernel_constraint = SpectralNorm())
    
    展开全文
  • PIE SDK归一化水体指数法

    千次阅读 2019-07-31 11:19:00
     归一化指数法(NDWI(Normalized Difference Water Index,归一化水指数)),用遥感影像的特定波段进行归一化差值处理,以凸显影像中的水体信息。  其表达式为NDWI =(p(Green)-p(NIR))/(p(Green)+p(NIR))  是基于绿...
  • 关于归一化,标准化的一些整理

    千次阅读 2019-01-08 10:23:02
    之前学习的过程中,一直以为归一化和标准化效果差不多,老师说让用哪种方法就用哪种方法就行,这可能就是一个经验问题。但是最近在群里讨论,发现这两个方法对数据的分布影响不同,因此搜集了一些资料,做点简单的...
  • 归一化/特征缩放(Feature Scaling) 笔记

    千次阅读 2019-02-02 18:07:26
    方差归一化3.均值归一化4.==标准归一化 StandardScaler== 归一化的目的:将所有特征缩放到0~1之间,使梯度下降法能更快的收敛。(其中0和1并不是定值,只是一个范围。) 为什么要做归一化? 各个特征xix_{i}xi​的...
  • Kmeans聚类①——数据标准化&归一化&正则化

    万次阅读 多人点赞 2019-06-14 20:55:34
    在进行机器学习之前,经常需要对训练数据进行标准化/归一化/正则化,为什么呢? **1)去除量纲的影响,将有量纲的数值变成无量纲的纯数值; 2)是去除各特征之间数值差异过大的问题,比如一个向量(uv:10000, rate:...
  • 矩阵数据归一化 java 实现

    千次阅读 2018-08-07 11:42:43
    概念参考:https://blog.csdn.net/zbc1090549839/article/details/44103801 ... 线性归一化 公式:X(norm) = (X - min) / (max - min) /** * 线性归一化 公式:X(norm) = (X - m...
  • 数据预处理归一化详细解释

    千次阅读 多人点赞 2020-09-28 23:11:05
    ps: 将数据归一化到[a,b]区间范围的方法: (1)首先找到原本样本数据X的最小值Min及最大值Max (2)计算系数:k=(b-a)/(Max-Min) (3)得到归一化到[a,b]区间的数据:Y=a+k(X-Min) 或者 Y=b+k(X-Max) 2.Z-score...
  • 机器学习常见归一化方法及实现

    万次阅读 2018-08-11 23:17:05
    归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为标量。 在多种计算中都经常用到这种方法。在对数据进行算法训练时,由于数据的问题可能导致算法的效果并不理想,这时候可以...
  • 1 归一化 归一化:我们通俗的可以理解为将数值映射到(0,1)之间。在机器学习之中我们可以理解为将某一特征的取值映射到(0,1)之间。 公式: xi−min(xi)max(xi)−min(xi)\frac{x_i-min(x_i)}{max(x_i)-min(x_i)}max...
  • 很多时候我们需要对栅格图像进行归一化操作,使所有DN值范围统一到0~1 之间。 归一化的公式为 Result=(DN-DNmin)/(DNmax-DNmin) 式中: Result为归一化之后的值 DN为原始像元值 DNmin、DNmax分别为波段的最小、最大...
  • 机器学习归一化(附Python实现源码)

    千次阅读 2018-09-30 16:39:45
    # -*- coding: utf-8 -*- import inspect import math import numpy as np from sklearn import preprocessing def max_min_normalization(data_... 利用最大最小数将一组数据进行归一化输出 x_new = (x - min)...
  • 归一化相关系数NCC

    千次阅读 2020-04-26 17:35:31
    # 和反归一化 # 保存 ncc 的分数 dmaps[:, :, displ] = s / np.sqrt(s_l * s_r) # 为每个像素选取最佳深度 return np.argmax(dmaps, axis=2) def plane_sweep_gauss(im_l,im_r,start,steps,wid): """ 使用带有高斯...
  • 弧度角归一化

    2020-07-30 15:41:52
    描述 在编写代码时,一般都是使用弧度角进行计算。弧度角可以是任意的,但作为...math.h> double NormalizeAngle(double angle) { double a = fmod(angle + M_PI, 2.0 * M_PI); if (a < 0.0) { a += (2.0 *
  • Java蓝桥杯 算法训练 复数归一化

    万次阅读 多人点赞 2019-06-13 12:40:35
    算法提高 复数归一化 时间限制:1.0s 内存限制:512.0MB 编写函数Normalize,将复数归一化,即若复数为a+bi,归一化结果为a/sqrt(aa+bb) + ib/sqrt(aa+b*b) 。使用结构体指针类型作为函数参数可能是必要的。其中...
  • In practice, inserting them less frequently -- say, every 1-3 inceptions -- will work just fine. You can ignore these in deployment because they've already done their job: when there's no back-...
  • 复数归一化

    千次阅读 2018-12-23 10:05:15
    编写函数Normalize,将复数归一化,即若复数为a+bi,归一化结果为a/sqrt(a*a+b*b) + i*b/sqrt(a*a+b*b) 。使用结构体指针类型作为函数参数可能是必要的。其中实部和虚部由键盘输入,输出为归一化结果,如果归一化...
  • python实现信号幅值归一化 功能:实现信号幅值归一化 输入x为原信号,是一个numpy的1D张量 输出y为幅值归一化信号,是一个numpy的1D张量 调用格式{y = normalized(x)} def normalized(x): y = x - np.mean(x) # ...
  • pytorch实现n个向量的归一化
  • KNN, 数据归一化

    2019-11-21 22:41:19
    KNN - K近邻算法 K-Nearest Neighbors 特点 思想极度简单 ...根据一个点A的位置,计算距离这个点最近的3(k)个点的的类型。来进行投票产生A的类型 计算距离: KNN的过程 import numpy as np from ...
  • 1.认识归一化 总结1:归一化是使计量(物理)系数值的绝对值变成某种相对值的相关性办法 总结2:在以前的本科化学的量子学里,表达粒子的量子态的波函数必须满足归一条件,也就是说,在空间内找到粒子的概率必须...
  • 归一化指数函数

    2021-07-28 09:53:29
    在数学,尤其是概率论和相关领域中,归一化指数函数,或称Softmax函数,是逻辑函数的一种推广。它能将一个含任意实数的K维向量z“压缩”到另一个K维实向量σ(z)中,使得每一个元素的范围都在(0,1)之间,并且所有元素...
  • 补一下上次文章的坑,有关标准化和归一化的问题.标准化:(X-E(x))/D(x)归一化: (X-min)/(max-min)两个的具体差别我的感受不是特别深刻,用的比较多的是归一化.from sklearn.preprocessing import MinMaxScaler mm = ...
  • python 复数归一化处理

    2020-08-13 11:38:55
    python 复数归一化处理 归一化算法 复数格式为x=a+bix=a+bix=a+bi, 归一化算法如下: x′=a÷a2+b2+bi÷a2+b2x' = a\div\sqrt{a^2 + b^2} + bi\div\sqrt{a^2 + b^2}x′=a÷a2+b2​+bi÷a2+b2​ 算法实现 from math ...
  • 数组的归一化

    千次阅读 2019-06-19 21:03:58
    问题 K: 数组的归一化 问题 K: 数组的归一化时间限制: 1 Sec  内存限制: 128 MB提交: 1633 ...比如:给定一个数组1 2 3 4,那么归一化之后是0.10 0.20 0.30 0.40,即每个元素值除以10(数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,144
精华内容 4,057
关键字:

math3归一化