지노랩 /JinoLab

17. 데이터 정규화(Normalization) 과정 본문

프로그래밍/C언어를 이용한 Deep Learning

17. 데이터 정규화(Normalization) 과정

지노랩/JinoLab 2025. 8. 12. 09:53
  • 각 벡터의 최댓값을 찾아
  • 해당 최댓값으로 모든 원소를 나누어
  • [0,1] 구간으로 스케일링 합니다.
#include <stdio.h>

/**
 * @brief 1차원 배열에서 최댓값을 찾습니다.
 * @param arr   입력 배열
 * @param n     배열 길이
 * @return      최댓값
 */
double max_in_array(const double *arr, int n) {
    double m = arr[0];
    for (int i = 1; i < n; i++) {
        if (arr[i] > m) {
            m = arr[i];
        }
    }
    return m;
}

/**
 * @brief 배열을 [0,1] 구간으로 정규화합니다.
 *        각 원소를 최댓값으로 나눈 결과를 out[]에 저장.
 * @param in    입력 배열
 * @param out   정규화 결과 저장 배열 (동일 길이)
 * @param n     배열 길이
 */
void normalize_data(const double *in, double *out, int n) {
    double m = max_in_array(in, n);
    for (int i = 0; i < n; i++) {
        out[i] = in[i] / m;
    }
}

int main(void) {
    // ── 1) 원본 데이터 ──
    // 3개의 학습 예시(each row): [운동시간, 휴식시간] → 근육증가량
    const int M = 3;        // 샘플 개수
    double x1[M]   = {2.0, 5.0, 1.0};     // 운동시간(hours)
    double x2[M]   = {8.0, 5.0, 8.0};     // 휴식시간(hours)
    double y[M]    = {291.0, 920.0, 190.0};// 근육증가량(grams)

    // ── 2) 정규화 결과 저장 버퍼 ──
    double x1_n[M], x2_n[M], y_n[M];

    // ── 3) 정규화 수행 ──
    normalize_data(x1, x1_n, M);
    normalize_data(x2, x2_n, M);
    normalize_data(y,  y_n,  M);

    // ── 4) 결과 출력 ──
    printf("원본    | 정규화\n");
    printf("--------+----------------------------\n");
    printf("Idx | x1   x2   y    | x1_n    x2_n    y_n\n");
    printf("----+--------------------------------------\n");
    for (int i = 0; i < M; i++) {
        printf("%3d | %4.1f %4.1f %4.1f | %7.4f %7.4f %7.4f\n",
               i+1, x1[i], x2[i], y[i],
               x1_n[i], x2_n[i], y_n[i]);
    }

    return 0;
}

실행 예시

gcc -o normalize normalize.c
./normalize
원본    | 정규화
--------+----------------------------
Idx | x1   x2   y    | x1_n    x2_n    y_n
----+--------------------------------------
  1 |  2.0  8.0 291.0 | 0.4000  1.0000  0.3169
  2 |  5.0  5.0 920.0 | 1.0000  0.6250  1.0000
  3 |  1.0  8.0 190.0 | 0.2000  1.0000  0.2065
  • max_in_array: 배열 내 최댓값을 찾아 반환
  • normalize_data: 각 원소를 최댓값으로 나누어 [0,1] 구간으로 스케일링
  • main:
    1. 원본 x1, x2, y 정의
    2. 정규화 결과를 받을 x1_n, x2_n, y_n 선언
    3. normalize_data 호출
    4. 원본과 정규화된 값을 나란히 출력

이제 이 정규화된 데이터를 신경망에 입력으로 사용하면, 입력값과 출력값의 스케일 차이로 인한 학습 불안정 문제를 완화할 수 있습니다.