훈련 데이터의 경향을 제거해 학습에 도움을 준다.
데이터 정규화, 데이터 표준화는 가장 기본전인 전처리
데이터의 각 샘플을 선형 변환하여 그 성분 단위의 평균과 분산을 구한다.
먼저 각 성분에서 해당 성분의 평균을 빼서 평균이 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이 된다.