数学建模社区-数学中国

标题: 数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值... [打印本页]

作者: 浅夏110    时间: 2020-6-3 16:17
标题: 数据变换方法: 初值化、 均值化、百分比/倍数变换、归一化、极差最大值化、区间值...
特征归一化,又叫 特征缩放,Feature Normalization,Feature Scaling。各特征由于数值大小范围不一致,通过缩放特征的取值范围,可以消除量纲,使特征具有可比性。只有各特征之间的大小范围一致,才能使用距离度量等算法,加速梯度下降算法的收敛;在SVM算法中,一致化的特征能加速寻找支持向量的时间;不同的机器学习算法,能接受的输入数值范围不一样。sklearn中最常用的特征归一化方法是MinMaxScaler和StandardScaler。$ @" A# \3 \! Z( [$ W9 R

  W! I8 w5 r5 t. t4 |当我们需要将特征值都归一化为某个范围[a,b]时,选 MinMaxScaler
1 [' s0 X  q6 P% ]% u5 f当我们需要归一化后的特征值均值为0,标准差为1,选 StandardScaler4 q; ?0 ^! [- q2 m: T3 A" v
数据变换的目的:
8 K- {. a* t: ^) W  对收集来的原始数据必须进行数据变换和处理,主要是为了消除量纲,使其具有可比性。
- o# K+ V8 z( r5 M3 |
' n5 I% [/ _6 s' x 定义 : 设有n个数据的序列  ,则称映射
- K, I( l- \! g+ v, M% o
. _$ l- n6 i) L+ r0 Z' k                                        - O% u2 z- t% ?

' B  F& H% q8 l8 }  d          为序列 x到序列 y 的数据变换。
' p1 [+ d& ^5 H1 q5 V! C3 R1 \5 i
# Y8 u1 L, @4 ]6 t数据变换的七种常见方式
5 ?. y8 V  u+ b; X  q/ w" B  z4 ]/ J此处是对同一维度上的各个数据进行变换,如果数据有多个维度/属性,那就拆开来一个属性属性地变换,写成矩阵形式时,它也是分别对各维度进行操作。* ?& S, }7 h5 _4 H; Q: |
, A) P) h! k- J0 h8 g
初值化变换
+ c: H" s: O+ R9 S2 q/ P7 W( C  p# z
( b4 N7 B; Q# |- E, n, k
2 P# V$ L/ G. _! t 也就是要对每一个数据,都除以第一个数据。% l" g2 i4 J! q! X' \+ B
$ C& _; `! Z$ L3 ~8 a, q% F
均值化变换
8 l2 o) B* i6 L
6 ?, y9 y/ @: F/ E7 S+ B9 s) i
+ f$ s1 \8 ]& A8 L; h6 d- G             对每一个数据,都除以均值。2 ^5 p8 A% N6 ~5 Y" \- C  K5 G  G
% E; w, M' C! s/ M4 k
百分比变换
: s8 u& W) g6 p; E9 S( o6 ?
  X& [! ^! L; p  I$ o5 h  h) u8 U% }
分母为x的该列属性中,值最大的那一个,使得变换后的值的绝对值,在[0,1]之间。# L% a  ~( N7 T/ q9 L) V
' S# S. V$ Y( U& G4 h' e- a5 `6 k
倍数变换4 w/ Z  c, ~+ O% y* O8 V% {
   
% U8 `' n: q! Q% n5 s* [. A  D1 {' e9 G; v0 z/ ?1 T
归一化变换
( c. |  o8 k% I2 J* E7 T5 E3 W" l1 j, z; F

" ]/ T+ Q5 y2 ]; ?  t: z& ?; m( z 其中   为大于零的某个值,称  是归一化变换。 0 }! O% V$ a9 I0 Q" r

: c; o7 @2 w4 ^7 f1 {2 S! m
  m4 B$ g' |: |4 t& L0 R3 A. i5 K极差最大值化变换
: j, i, R: ^! g4 q
$ P( s% P! i! [
8 V4 b2 Q2 }- @0 [* V' O) \  ^
  D) f$ I, O/ T1 P
6 t# P' z9 q, ~, j' [5 Y; a: y0 [! q区间值化变换% W# g$ r1 X* X. i, j
& R$ P* w8 C$ }

' N! }4 i& k0 |7 ?6 b: G) F7 m/ O                  ,
' O8 r. R& B: G% N2 @  g/ u
$ }: T, k8 @& U" O/ S- R" h1. matlab 的mapminmax归一化函数/ v+ U2 t. K. @" e/ B
函数用法:
6 r. C3 @/ q/ F+ r- I( `' j; H1 e( w/ n [Xn,Xps]=mapminmax(X,min,max)
, a9 J/ D+ q1 w, B/ d
0 u; `3 h2 N6 \  m# y4 f8 y& Q说明:(1)该函数将X按行归一化,即计算某元素的归一化值时,最大最小值时该元素所处行的最大最小值;因此若只有一组观测时,X需是1*N的行向量。& u7 S( b4 i& x7 o1 _7 R# V
' A' A% L5 a3 w6 }9 e
   (2)min,max规定X的归一化范围,根据需要自行设置
9 @  |  R, [& p+ H9 h- [* i; g2 v3 P$ O
   (3)ps是结构变量记录了归一化时的最大值最小值等参数,后续可重复调用     7 v$ U/ H3 d+ x7 ^; Z' d$ m" S; h

" \0 e' j1 k# |" N" Y" w7 ~8 a) a 调用方法:
3 o; t4 C( B7 X, e% v! D' W- [  G
0 u3 m, l% h+ x1 h2 X) j% E) oX1=mapminmax('apply', X_new,Xps);%利用先前的结构Xps进行相同的归一化
& M5 H$ A- A* ^0 _% b4 _8 ?' E3 I5 g- W/ a
X2=mapminmax('reverse',Xn, Xps);%反归一化
! C; k$ M* Y2 Q7 }  B2 A
/ U0 n0 i9 c! g: o- H' Kx=[1,-1,2;   2,0,0;   0,1,-1]" p  l0 K0 I( `8 o' g* E8 ~
[x1,Xps]=mapminmax(x,0,1)7 d9 s" ]* x% t$ K9 P

) o- D: Z1 A7 F" E) E
8 a$ [' b; w1 K# L+ N% A6 U7 k& F+ O' W) e
对于python中的axis=0 和axis=1的问题
0 @& |$ u; Q( u( n 如df.mean其实是在每一行上取所有列的均值,而不是保留每一列的均值。也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词(译者注)! a/ z. }0 m0 E
换句话说:$ r( z& Y$ j2 P; H4 H

1 C6 ?! R! G. v0 H; W) d' I使用0值表示沿着每一列或行标签\索引值向下执行方法8 c& f% m7 i: ~" F) [) n3 g" \/ Z
使用1值表示沿着每一行或者列标签模向执行对应的方法8 I3 P5 o& d  w5 ?9 `3 L6 k

8 Q: }5 [1 ?4 [# R2 \6 i
& D( o* W# @* G' N" s# Y; k; A& i, E0 d5 s' x& H: w. n
python的sklearn中 scale函数8 T& M  }4 P8 J! \: Q0 p, ~
1 标准化,均值去除和按方差比例缩放
$ P* D: X1 ]5 D4 p# b1 |" l              (Standardization, or mean removal and variance scaling)
7 F  M7 A" g, Y5 i6 j9 Y
% R7 U! b2 W) X+ S9 L% r  数据集的标准化:当个体特征太过或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。# v4 U2 L) |2 B* Q, ~+ j: p
( d$ ^6 O) M! D2 ]" D: I) M
from sklearn import preprocessing + h! }4 G! z- \3 r6 V# L
import numpy as np  . T1 @; F' k+ L; _- H! }
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  
( Y" z$ R9 M: b& a& \1 f# l& l/ z  B; rX_scaled = preprocessing.scale(X) # T, d# P3 R6 h: y( u- i+ w

4 i' f: k& Y' A#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
* J3 f4 D! G+ T4 B* k; i, B$ N8 c                                  [ 1.22474487  0.         -0.26726124]
3 d! f# a- u; X+ u! {                                  [-1.22474487  1.22474487 -1.06904497]]
: m' {2 j5 O0 w# G' l, H#scaled之后的数据列为零均值,单位方差5 t, E6 M3 \3 r" _+ U& z4 }: k
X_scaled.mean(axis=0)  # column mean: array([ 0.,  0.,  0.])  ; o8 H/ ?2 z8 W! K! y
X_scaled.std(axis=0)  #column standard deviation: array([ 1.,  1.,  1.])
9 Q  d  r+ U- e1 N6 d' t/ F+ Z" ^4 k9 N' D' D' O' n
! z4 A6 j, e! k9 z

* I- u- E, ^7 k- x& N& z- W# CStandardScaler # G4 W4 O9 x; L1 n
Standardization即标准化,StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。归一化后,矩阵每列的均值为0,标准差为1,形如标准正态分布(高斯分布)。 通过计算训练集的平均值和标准差,以便测试数据集使用相同的变换。(在numpy中,有std()函数用于计算标准差)1 k. K' Y2 I* x- G4 ?: _
8 R6 k2 i4 W: z7 [* i
from sklearn.preprocessing import StandardScaler
4 m* D3 z4 |* p" ~x=[[10001,2],[16020,4],[12008,6],[13131,8]]+ T/ q' l! I7 C4 p
X_scaler = StandardScaler()2 D& l  O& I1 C  x1 [% w
X_train = X_scaler.fit_transform(x)+ l% \. X* [6 P7 M0 U
X_train1 P7 t' m* V2 u$ c9 \
#结果如下0 }6 p8 ?; R: {# Z* }2 e
array([[-1.2817325 , -1.34164079],
$ y6 i6 c3 `, A4 O1 i% {       [ 1.48440157, -0.4472136 ],2 r; t& w) O0 x
       [-0.35938143,  0.4472136 ]," `$ M! s, x5 r
       [ 0.15671236,  1.34164079]])' U0 Z& Y$ ^# V" x

1 r2 P+ u8 B" n# f" @" T3 Q: \) d7 C3 w' O; G

& F! O& i/ d) s, L

注 :

from sklearn.preprocessing import StandardScaler
  k( b$ R8 j) O8 ~7 `x=[[10001,2],[16020,4],[12008,6],[13131,8]]
0 [- X, x: @" s/ _X_scaler = StandardScaler()6 ~+ s( V3 y" Q' H
X_train = X_scaler.fit_transform(x)
2 X2 T- U1 {& M. }X_train8 a; @  V  Y6 R
#结果如下0 A2 v6 g) d2 C* _  s% y$ ?8 j
array([[-1.2817325 , -1.34164079],
- B) c7 Q$ j6 j2 n       [ 1.48440157, -0.4472136 ],6 p1 e  g6 h5 W* `
       [-0.35938143,  0.4472136 ],
% F. v5 e% Z2 q! w4 y  T% Q       [ 0.15671236,  1.34164079]])- z( @3 l7 q2 \5 q' h! f* |, ]" b
1 ~! ]/ S9 i, T* y  m
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)+ Z7 \) E2 p! k! r
scaler.mean_  #out: array([ 1.,  0. ,  0.33333333])  + O+ R+ e) |9 b9 ]" M+ n+ z
scaler.std_ #out: array([ 0.81649658,  0.81649658,  1.24721913]) / H8 g. e/ m* s8 A8 E
#测试将该scaler用于输入数据,变换之后得到的结果同上' m* ^& r, S; _. B% b7 N) I, L
scaler.transform(X)
' c- ]6 c" h0 Y9 r7 U9 Y% p9 N9 s#out: + q: l/ a& `' e, B
array([[ 0., -1.22474487,  1.33630621], " F# Q; x* J3 U8 R
       [ 1.22474487, 0. , -0.26726124], 5 W+ r. G7 |+ M( j" ^
       [-1.22474487,1.22474487, -1.06904497]])  + {3 d% M9 l- K' |
scaler.transform([[-1., 1., 0.]])  #scale the new data
+ s# Q9 ~, n# o$ ~# out: array([[-2.44948974,  1.22474487, -0.26726124]])6 a7 G3 u4 v+ s2 r6 Q5 d* I; l
8 B* v6 f6 x; q3 Y4 h' A4 L7 P  h
2 将数据特征缩放至某一范围(scalingfeatures to a range)" M1 U$ `. u& E$ J

; ~( d! _+ A6 p. J+ k! p
% e2 M2 c8 {# @2 n8 f- l' u
2.1 MinMaxScaler (最小最大值标准化)
( Y. O: J& P  }4 X% y. Y 它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。  
8 K5 l% P$ N% a# ~5 n( Y9 {$ ~$ L$ C" y" `
from sklearn.preprocessing import MinMaxScaler% H1 x! M' `6 C) \
x=[[10001,2],[16020,4],[12008,6],[13131,8]]
& w  i9 `& {6 X' R& ^min_max_scaler = MinMaxScaler()
; w" O! s* n6 V1 ~# zX_train_minmax = min_max_scaler.fit_transform(x) #归一化后的结果,& d' z0 X9 _* K
$ J- s8 \# g8 P5 i
min_max_scaler = MinMaxScaler(feature_range=(-1,1))$ z2 K0 d7 u* F* c- Z, Q+ q
X_train_minmax = min_max_scaler.fit_transform(x) #归一化到(-1,1)上的结果' [) i# k% p0 h# D6 r( L
# Z3 F# \+ L* q; e
MinMaxScaler的实现
% v; Z7 h0 y# [9 uX_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
; l! r/ P6 y9 @2 k/ q  I4 BX_scaled = X_std / (max - min) + min
% \. G5 ~3 ]" \7 X$ n/ Y
& L. w5 J. F* _7 {; z这是 向量化的表达方式,说明X是矩阵,其中) ^! [( p2 e3 i7 N% v( L0 m
) R) d% h, i" S6 t
X_std:将X归一化到[0,1]之间
) V6 r* M4 L" ?! E4 vX.min(axis=0)表示列最小值
% `" {4 N+ x, I+ n1 Hmax,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
1 ?) S( i# K; j% S/ ?, Y& L/ t3 b( Y0 [& `) u; B2 E5 S, v

: x3 J  J8 {- |! s2.2 MaxAbsScaler(绝对值最大标准化): W% s# Z" b  y- R  v3 b2 l( Y5 A
         与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
' ]+ n+ T, |" x( P- H9 w
: Z" n# z! ^5 y4 h. |1 b1 Y' O1 aX_train = np.array([[ 1., -1.,  2.],
" B2 @4 e% u" h- |6 ^                     [ 2.,  0.,  0.],
: x1 j" L6 i" e2 f. r5 c$ i7 y4 `                    [ 0.,  1., -1.]])0 y& O: M* x% C2 R4 v
max_abs_scaler = preprocessing.MaxAbsScaler()
" k0 m4 D- L+ y- h% _' i) v; AX_train_maxabs = max_abs_scaler.fit_transform(X_train)
- ]* x6 ]6 R! q, u9 R# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])0 }( a3 J& v% I$ p) ?' G& E
X_test = np.array([[ -3., -1.,  4.]]); c' {  z) U7 z4 }2 {( b
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])/ a% p5 z* h" J9 l# R, U
max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])
  v9 A9 U' a8 `( S$ Y/ D) i" q# D. u# y3 S, F9 g+ T
' f- I% M* A% V/ W4 l; A8 J

! g, `9 t4 w6 v0 Q5 y
3 D9 k! g* ?6 l/ L/ Z' v0 l7 y1 E) p) o

9 i. p$ N& m. e  B/ x( R2 v
. O/ x) |1 ?2 p+ }; X4 |
" P) L9 B" {, o  j8 _  ]4 R9 p$ t
8 p  l/ q6 d# ?7 K) U: v- Q! E$ G
- q6 L2 z8 S0 c; ?2 X/ Z- W————————————————1 B4 |' A3 k6 @$ r
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 Q. P7 @) I5 }8 O$ F) n# R' Z
原文链接:https://blog.csdn.net/qq_29831163/article/details/89420223
2 O5 ?7 a/ b" h0 x( z& X0 D6 I) K, t7 s) J' w& W5 U% }7 _2 i2 R

$ T8 H# l' A5 v; ~8 P




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5