Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

normalize

归一化数据

说明

示例

N = normalize(A) 按向量返回 A 中数据的 z 值(中心为 0、标准差为 1)。

  • 如果 A 是向量,则 normalize 对整个向量 A 进行运算。

  • 如果 A 是矩阵,则 normalize 分别对 A 的每列进行运算。

  • 如果 A 是多维数组,则 normalize 沿 A 的大小不等于 1 的第一个维度进行运算。

  • 如果 A 是表或时间表,则 normalize 分别对 A 的每个变量进行运算。

示例

N = normalize(A,dim) 指定要沿其进行运算的 A 的维度。例如,normalize(A,2) 对每个行进行归一化。

示例

N = normalize(___,method) 使用上述任一语法指定归一化方法。例如,normalize(A,"norm") 通过欧几里德范数(2-范数)对 A 中的数据进行归一化。

示例

N = normalize(___,method,methodtype) 指定给定方法的归一化类型。例如,normalize(A,"norm",Inf) 使用无穷范数归一化 A 中的数据。

示例

N = normalize(___,"center",centertype,"scale",scaletype) 同时使用 "center""scale" 方法。只有这两种方法可以一起使用。如果未指定 centertypescaletype,则 normalize 将使用该方法的默认方法类型(中心化以使均值为 0 并按标准差缩放)。

此语法支持使用任意中心化和缩放类型同时执行这两个方法。例如,N = normalize(A,"center","median","scale","mad")。您也可以使用此语法指定以前计算的归一化的中心化和缩放值 CS。例如,用 [N1,C,S] = normalize(A1) 归一化一个数据集并保存参数。然后,用 N2 = normalize(A2,"center",C,"scale",S) 对不同数据集重用这些参数。

示例

N = normalize(___,Name,Value) 使用一个或多个名称-值参量指定用于归一化的其他参量。例如,当 A 是表或时间表时,normalize(A,"DataVariables",datavars)datavars 指定的变量进行归一化。

示例

[N,C,S] = normalize(___) 还返回用于执行归一化的中心化和缩放值 CS。然后,您可以通过 N = normalize(A2,"center",C,"scale",S) 使用 CS 中的值来归一化不同输入数据。

示例

全部折叠

通过计算 z 分数来归一化向量和矩阵中的数据。

创建一个向量 v 并计算 Z 分数,从而将数据归一化,使其均值为 0,标准差为 1。

v = 1:5;
N = normalize(v)
N = 1×5

   -1.2649   -0.6325         0    0.6325    1.2649

创建一个矩阵 B 并计算每列的 z 分数。然后,对每个行进行归一化。

B = magic(3)
B = 3×3

     8     1     6
     3     5     7
     4     9     2

N1 = normalize(B)
N1 = 3×3

    1.1339   -1.0000    0.3780
   -0.7559         0    0.7559
   -0.3780    1.0000   -1.1339

N2 = normalize(B,2)
N2 = 3×3

    0.8321   -1.1094    0.2774
   -1.0000         0    1.0000
   -0.2774    1.1094   -0.8321

对向量 A 按其标准差进行缩放。

A = 1:5;
Ns = normalize(A,"scale")
Ns = 1×5

    0.6325    1.2649    1.8974    2.5298    3.1623

A 进行缩放,使其范围在 [0, 1] 区间内。

Nr = normalize(A,"range")
Nr = 1×5

         0    0.2500    0.5000    0.7500    1.0000

创建向量 A 并用它的 1-范数对其进行归一化。

A = 1:5;
Np = normalize(A,"norm",1)
Np = 1×5

    0.0667    0.1333    0.2000    0.2667    0.3333

A 中的数据进行中心化,使其均值为 0。

Nc = normalize(A,"center","mean")
Nc = 1×5

    -2    -1     0     1     2

创建一个表,其中包含五个人的身高信息。

LastName = ["Sanchez";"Johnson";"Lee";"Diaz";"Brown"];
Height = [71;69;64;67;64];
T = table(LastName,Height)
T=5×2 table
    LastName     Height
    _________    ______

    "Sanchez"      71  
    "Johnson"      69  
    "Lee"          64  
    "Diaz"         67  
    "Brown"        64  

按最大身高对身高数据进行归一化。

N = normalize(T,"norm",Inf,"DataVariables","Height")
N=5×2 table
    LastName     Height 
    _________    _______

    "Sanchez"          1
    "Johnson"    0.97183
    "Lee"        0.90141
    "Diaz"       0.94366
    "Brown"      0.90141

创建一个包含实部和虚部的向量。

a = [1; 2; 3; 4];
b = [2; -2; 7; -7];
z = complex(a,b)
z = 4×1 complex

   1.0000 + 2.0000i
   2.0000 - 2.0000i
   3.0000 + 7.0000i
   4.0000 - 7.0000i

归一化复数向量。要在保持相位的同时缩放幅值,请按无穷范数或最大幅值进行缩放。使用 norm 方法指定 Inf 选项。该函数返回一个复平面单位向量。

N = normalize(z,"norm",Inf)
N = 4×1 complex

   0.1240 + 0.2481i
   0.2481 - 0.2481i
   0.3721 + 0.8682i
   0.4961 - 0.8682i

验证归一化向量是否在复平面单位圆内。

Nmag = max(abs(N))
Nmag = 1

验证归一化向量和原始向量的对应元素之间的比率是否相同。

r = N ./ z
r = 4×1

    0.1240
    0.1240
    0.1240
    0.1240

验证归一化向量的相位角是否与原始向量的相位角相同。

ztheta = angle(z)
ztheta = 4×1

    1.1071
   -0.7854
    1.1659
   -1.0517

Ntheta = angle(N)
Ntheta = 4×1

    1.1071
   -0.7854
    1.1659
   -1.0517

归一化数据集,返回计算出的参数值,并重用这些参数以对另一个数据集应用相同的归一化。

创建一个包含两个变量 TemperatureWindSpeed 的时间表。然后用同样的变量创建第二个时间表,但使用的采样是一年后收集的。

rng default 
Time1 = (datetime(2019,1,1):days(1):datetime(2019,1,10))';
Temperature = randi([10 40],10,1);
WindSpeed = randi([0 20],10,1);
T1 = timetable(Temperature,WindSpeed,'RowTimes',Time1)
T1=10×2 timetable
       Time        Temperature    WindSpeed
    ___________    ___________    _________

    01-Jan-2019        35             3    
    02-Jan-2019        38            20    
    03-Jan-2019        13            20    
    04-Jan-2019        38            10    
    05-Jan-2019        29            16    
    06-Jan-2019        13             2    
    07-Jan-2019        18             8    
    08-Jan-2019        26            19    
    09-Jan-2019        39            16    
    10-Jan-2019        39            20    

Time2 = (datetime(2020,1,1):days(1):datetime(2020,1,10))';
Temperature = randi([10 40],10,1);
WindSpeed = randi([0 20],10,1);
T2 = timetable(Temperature,WindSpeed,'RowTimes',Time2)
T2=10×2 timetable
       Time        Temperature    WindSpeed
    ___________    ___________    _________

    01-Jan-2020        30            14    
    02-Jan-2020        11             0    
    03-Jan-2020        36             5    
    04-Jan-2020        38             0    
    05-Jan-2020        31             2    
    06-Jan-2020        33            17    
    07-Jan-2020        33            14    
    08-Jan-2020        22             6    
    09-Jan-2020        30            19    
    10-Jan-2020        15             0    

将第一个时间表归一化。指定三个输出:归一化后的表,以及函数用于执行归一化的中心化和缩放参数值 CS

[T1_norm,C,S] = normalize(T1)
T1_norm=10×2 timetable
       Time        Temperature    WindSpeed
    ___________    ___________    _________

    01-Jan-2019      0.57687       -1.4636 
    02-Jan-2019        0.856       0.92885 
    03-Jan-2019      -1.4701       0.92885 
    04-Jan-2019        0.856       -0.4785 
    05-Jan-2019     0.018609       0.36591 
    06-Jan-2019      -1.4701       -1.6044 
    07-Jan-2019      -1.0049      -0.75997 
    08-Jan-2019     -0.26052       0.78812 
    09-Jan-2019      0.94905       0.36591 
    10-Jan-2019      0.94905       0.92885 

C=1×2 table
    Temperature    WindSpeed
    ___________    _________

       28.8          13.4   

S=1×2 table
    Temperature    WindSpeed
    ___________    _________

      10.748        7.1056  

现在使用第一个归一化的参数值来归一化第二个时间表 T2。此方法确保 T2 中的数据以与 T1 相同的方式中心化并缩放。

T2_norm = normalize(T2,"center",C,"scale",S)
T2_norm=10×2 timetable
       Time        Temperature    WindSpeed
    ___________    ___________    _________

    01-Jan-2020      0.11165      0.084441 
    02-Jan-2020      -1.6562       -1.8858 
    03-Jan-2020      0.66992       -1.1822 
    04-Jan-2020        0.856       -1.8858 
    05-Jan-2020       0.2047       -1.6044 
    06-Jan-2020      0.39078       0.50665 
    07-Jan-2020      0.39078      0.084441 
    08-Jan-2020      -0.6327       -1.0414 
    09-Jan-2020      0.11165       0.78812 
    10-Jan-2020       -1.284       -1.8858 

默认情况下,normalizeT2 中也存在于 CS 中的全部变量进行操作。要归一化 T2 中的变量子集,请使用 DataVariables 名称-值参量指定要对其进行操作的变量。您指定的变量子集必须出现在 CS 中。

WindSpeed 指定为要对其进行操作的数据变量。normalize 对该变量进行操作并原样返回 Temperature

T2_partial = normalize(T2,"center",C,"scale",S,"DataVariables","WindSpeed")
T2_partial=10×2 timetable
       Time        Temperature    WindSpeed
    ___________    ___________    _________

    01-Jan-2020        30         0.084441 
    02-Jan-2020        11          -1.8858 
    03-Jan-2020        36          -1.1822 
    04-Jan-2020        38          -1.8858 
    05-Jan-2020        31          -1.6044 
    06-Jan-2020        33          0.50665 
    07-Jan-2020        33         0.084441 
    08-Jan-2020        22          -1.0414 
    09-Jan-2020        30          0.78812 
    10-Jan-2020        15          -1.8858 

输入参数

全部折叠

输入数据,指定为标量、向量、矩阵、多维数组、表或时间表。

如果 A 是数值数组并且类型为 single,则输出的类型也是 single。否则,输出的类型为 double

normalize 忽略 A 中的 NaN 值。

数据类型: double | single | table | timetable
复数支持:

运算维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。

对于表或时间表输入数据,不支持 dim,并且分别对每个表或时间表变量进行运算。

归一化方法,指定为下表中的选项之一。

方法

描述

"zscore"

计算 z 分数。对数据进行中心化以使其均值为 0,缩放数据以使其标准差为 1。

"norm"

按 2-范数(也称为欧几里德范数)缩放数据。

"scale"

缩放数据以使其标准差为 1。

"range"

将数据范围重新缩放至 [0, 1]。

"center"

对数据进行中心化以使其均值为 0。

"medianiqr"

对数据进行中心化以使其中位数为 0,缩放数据以使其四分位差为 1。

要返回函数用于归一化数据的形参,请指定 CS 输出实参。

方法类型,指定为数组、表、二元素行向量或类型名称,具体取决于指定的方法。

方法

方法类型选项

描述

"zscore"

"std"(默认值)

计算 z 分数。对数据进行中心化以使其均值为 0,缩放数据以使其标准差为 1。

"robust"

计算 z 分数。对数据进行中心化以使其均值为 0,缩放数据以使其中位数绝对偏差为 1。

"norm"

正数值标量(默认值为 2)

p-范数缩放数据,其中 p 是正数值标量。

Inf

p-范数缩放数据,其中 p 是 Inf。无穷范数(或最大范数)与数据中元素的最大幅值相同。

"scale"

"std"(默认值)

缩放数据以使其标准差为 1。

"mad"

缩放数据以使其中位数绝对偏差为 1。

"first"

按数据的第一个元素缩放数据。

"iqr"

缩放数据以使其四分位差为 1。

数值数组

按数值数组缩放数据。该数组必须具有与输入 A 兼容的大小

按表中的变量缩放数据。输入数据 A 中的每个表变量都使用缩放表中名称相似的变量的值进行缩放。

"range"

二元素行向量(默认为 [0 1])

将数据范围重新缩放[a b],其中 a < b

"center"

"mean"(默认值)

对数据进行中心化以使其均值为 0。

"median"

对数据进行中心化以使其中位数为 0。

数值数组

按数值数组平移中心。该数组必须具有与输入 A 兼容的大小

按表中的变量平移中心。输入数据 A 中的每个表变量使用中心化表中名称相似的变量中的值进行中心化。

要返回函数用于归一化数据的形参,请指定 CS 输出实参。

中心化和缩放方法类型,分别指定为 "center""scale" 方法的任何有效 methodtype 选项。有关每个方法的可用选项列表,请参阅 methodtype 参量说明。

示例: N = normalize(A,"center",C,"scale",S)

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

示例: normalize(T,ReplaceValues=false)

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: normalize(T,"ReplaceValues",false)

要对其进行操作的表变量,指定为下表中的选项之一。DataVariables 值指示要填充输入表的哪些变量。

表中未由 DataVariables 指定的其他变量会传递给输出,而不会对其进行归一化。

索引方案示例

变量名称:

  • 字符串、字符向量或元胞数组

  • pattern 对象

  • "A"'A' - 名为 A 的变量

  • ["A","B"]{'A','B'} - 两个名为 AB 的变量

  • "Var"+digitsPattern(1) - 变量名为 "Var" 后跟一个数字

变量索引:

  • 引用变量在表中位置的索引编号

  • 由数字组成的向量

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [2 3] - 表中的第二个和第三个变量

  • [false false true] - 第三个变量

函数句柄:

  • 函数句柄,以表变量作为输入并返回逻辑标量

  • @isnumeric - 所有包含数值的变量

变量类型:

  • vartype 下标,用于选择指定类型的变量

  • vartype("numeric") - 所有包含数值的变量

示例: normalize(T,"DataVariables",["Var1" "Var2" "Var4"])

替换值指示符,当 A 是表或时间表时,指定为以下值之一:

  • true1 - 用包含归一化数据的表变量替换输入表变量。

  • false0 - 用包含归一化数据的表变量追加输入表变量。

对于向量、矩阵或多维数组输入数据,不支持 ReplaceValues

示例: normalize(T,"ReplaceValues",false)

输出参量

全部折叠

归一化值,以数组、表或时间表形式返回。

除非 ReplaceValues 的值为 false,否则 NA 的大小相同。如果 ReplaceValues 的值是 false,则 N 的宽度是输入数据宽度和指定的数据变量数目之和。

normalize 通常对输入表和时间表的所有变量进行运算,以下情况除外:

  • 如果指定 DataVariables,则 normalize 只对指定的变量执行运算。

  • 如果您使用语法 normalize(T,"center",C,"scale",S) 来使用先前计算的参数 CS 来归一化表或时间表 T,则 normalize 会自动使用 CS 中的变量名称来确定要对其进行运算的 T 中的数据变量。

中心化值,以数组或表形式返回。

A 是数组时,normalizeCS 以数组形式返回,满足 N = (A - C) ./ SC 中的每个值都是用于在指定维度上执行归一化的中心化值。例如,如果 A 是 10×10 数据矩阵,并且 normalize 在第一个维度上执行运算,则 C 是 1×10 向量,其中包含 A 中每列的中心化值。

A 是表或时间表时,normalize 以表形式返回 CS,其中包含归一化的每个表变量的中心化值和缩放值的表,即 N.Var = (A.Var - C.Var) ./ S.VarCS 的表变量名称与输入中对应的表变量匹配。C 中的每个变量都包含用于归一化 A 中名称相似的变量的中心化值。

缩放值,以数组或表形式返回。

A 是数组时,normalizeCS 以数组形式返回,满足 N = (A - C) ./ SS 中的每个值都是用于在指定维度上执行归一化的缩放值。例如,如果 A 是 10×10 数据矩阵,并且 normalize 在第一个维度上执行运算,则 S 是 1×10 向量,其中包含 A 中每列的缩放值。

A 是表或时间表时,normalize 以表形式返回 CS,其中包含归一化的每个表变量的中心化值和缩放值的表,即 N.Var = (A.Var - C.Var) ./ S.VarCS 的表变量名称与输入中对应的表变量匹配。S 中的每个变量都包含用于归一化 A 中名称相似的变量的缩放值。

详细信息

全部折叠

Z 值

z 值以标准差为单位测量数据点与均值的距离。标准化后的数据集均值为 0,标准差为 1,并保留原始数据集的形状属性(相同的偏斜度和峰度)。

对于具有均值 μ 和标准差 σ 的随机变量 X,值 x 的 z 值是 z=(xμ)σ.。对于具有均值 X¯ 和标准差 S 的采样数据,数据点 x 的 z 值是 z=(xX¯)S.

P-范数

具有 N 个元素的向量 v 的 p-范数的常规定义是

vp=[k=1N|vk|p]1/p,

,其中 p 是任何正的实数值、Inf-Inf。p 的一些常见值是 1、2 和 Inf

  • 如果 p 为 1,则所得的 1-范数是向量元素的绝对值之和。

  • 如果 p 为 2,则所得的 2-范数是向量的模或欧几里德长度。

  • 如果 p 为 Inf,则 v=maxi(|v(i)|)

重新缩放

重新缩放通过沿数字线拉伸或压缩点来更改数据集中最小值和最大值之间的距离。数据的 z 分数会保留,因此分布的形状保持不变。

将数据 X 重新缩放到任意区间 [a b] 的方程是

Xrescaled=a+[XminXmaxXminX](ba).

如果 A 是常量,则 normalize 返回区间的下界(默认为 0)或 NaN(当指定的区间包含 Inf 时)。

虽然 normalizerescale 函数都可以将数据重新缩放到任意区间,但 rescale 还允许将输入数据裁剪到指定的最小值和最大值。

四分位差

数据集的四分位差 (IQR) 说明对值进行排序时中间 50% 的值的范围。如果 Q1 是数据的第 25 个百分位数,Q3 是数据的第 75 个百分位数,则 IQR = Q3 - Q1

如果 A 是常量,则 A 的四分位差为 0,但如果值缺失或为无穷大,则 A 的四分位差为 NaN

当数据包含离群值(非常大或非常小的值)时,IQR 通常优于查看全部数据范围,因为 IQR 排除了数据中最大 25% 和最小 25% 的值。

中位数绝对偏差

数据集的中位数绝对偏差 (MAD) 是距数据中位数 X˜ 的绝对偏差的中位数值:MAD=median(|xX˜|)。因此,MAD 说明数据相对于中位数的变异性。

当数据包含离群值(非常大或非常小的值)时,MAD 通常优于使用数据的标准差,因为标准差对距均值的偏差求平方,从而使离群值的影响过大。相反,少量离群值的偏差不会影响 MAD 的值。

扩展功能

版本历史记录

在 R2018a 中推出

全部展开

另请参阅

函数

实时编辑器任务

App