본문 바로가기

카테고리 없음

데이터 정규화

훈련 데이터의 경향을 제거해 학습에 도움을 준다.

데이터 정규화, 데이터 표준화는 가장 기본전인 전처리

데이터의 각 샘플을 선형 변환하여 그 성분 단위의 평균과 분산을 구한다.

먼저 각 성분에서 해당 성분의 평균을 빼서 평균이 0이 되도록 한다.

X
>>>
array([[1.423e+01, 1.710e+00, 2.430e+00, ..., 1.040e+00, 3.920e+00,
        1.065e+03],
       [1.320e+01, 1.780e+00, 2.140e+00, ..., 1.050e+00, 3.400e+00,
        1.050e+03],
       [1.316e+01, 2.360e+00, 2.670e+00, ..., 1.030e+00, 3.170e+00,
        1.185e+03],
       ...,
       [1.327e+01, 4.280e+00, 2.260e+00, ..., 5.900e-01, 1.560e+00,
        8.350e+02],
       [1.317e+01, 2.590e+00, 2.370e+00, ..., 6.000e-01, 1.620e+00,
        8.400e+02],
       [1.413e+01, 4.100e+00, 2.740e+00, ..., 6.100e-01, 1.600e+00,
        5.600e+02]])
        
x_mean = np.mean(X, axis=0).reshape(1,-1)
x_mean
>>>
array([[1.30006180e+01, 2.33634831e+00, 2.36651685e+00, 1.94949438e+01,
        9.97415730e+01, 2.29511236e+00, 2.02926966e+00, 3.61853933e-01,
        1.59089888e+00, 5.05808988e+00, 9.57449438e-01, 2.61168539e+00,
        7.46893258e+02]])
        
x_deviation = X - x_mean
x_deviation
>>>
array([[ 1.22938202e+00, -6.26348315e-01,  6.34831461e-02, ...,
         8.25505618e-02,  1.30831461e+00,  3.18106742e+02],
       [ 1.99382022e-01, -5.56348315e-01, -2.26516854e-01, ...,
         9.25505618e-02,  7.88314607e-01,  3.03106742e+02],
       [ 1.59382022e-01,  2.36516854e-02,  3.03483146e-01, ...,
         7.25505618e-02,  5.58314607e-01,  4.38106742e+02],
       ...,
       [ 2.69382022e-01,  1.94365169e+00, -1.06516854e-01, ...,
        -3.67449438e-01, -1.05168539e+00,  8.81067416e+01],
       [ 1.69382022e-01,  2.53651685e-01,  3.48314607e-03, ...,
        -3.57449438e-01, -9.91685393e-01,  9.31067416e+01],
       [ 1.12938202e+00,  1.76365169e+00,  3.73483146e-01, ...,
        -3.47449438e-01, -1.01168539e+00, -1.86893258e+02]])
        
np.mean(x_deviation, axis=0).reshape(1,-1)
>>>
array([[ 6.31704427e-15,  2.94396218e-16, -1.11521279e-15,
         2.47492414e-15, -8.14329877e-15, -8.48260288e-17,
         9.14374693e-16, -5.42637096e-17, -1.06781001e-15,
        -5.48874304e-16,  4.26625027e-16,  1.43455784e-15,
        -2.52282589e-13]])

편차 값의 평균이 0이 나오지 않는 것은 실수 표현의 오차때문, 아주 작은 값이 나온다.

그 다음, 평균을 빼고 난 데이터의 각 성분을 그 표준편차로 나눈다. 

np.var(X[:,0])
>>>
0.6553597304633255

np.var(X[:,0])**(0.5) # 표준편차
>>>
0.8095429145285168

a = x_deviation[:,0]/np.var(X[:,0])**(0.5) # 편자를 표준편차로 나눠준다

np.mean(a)
>>>
7.903789982050553e-15

np.var(a)
>>>
1.0

평균은 0(에 가까운 값), 분산은 1이 된다.