지노랩 /JinoLab
17. 데이터 정규화(Normalization) 과정 본문
- 각 벡터의 최댓값을 찾아
- 해당 최댓값으로 모든 원소를 나누어
- [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:
- 원본 x1, x2, y 정의
- 정규화 결과를 받을 x1_n, x2_n, y_n 선언
- normalize_data 호출
- 원본과 정규화된 값을 나란히 출력
이제 이 정규화된 데이터를 신경망에 입력으로 사용하면, 입력값과 출력값의 스케일 차이로 인한 학습 불안정 문제를 완화할 수 있습니다.
'프로그래밍 > C언어를 이용한 Deep Learning' 카테고리의 다른 글
| 19. 활성화 함수(Activation Function) (3) | 2025.08.14 |
|---|---|
| 18. 은닉층·출력층 가중치 행렬 (2) | 2025.08.13 |
| 16. 헬스장 데이터(운동 시간·휴식 시간 → 근육량 증가) Forward Propagation (2) | 2025.08.11 |
| 15. 생물학적 뉴런의 기능과 인공 뉴런 비교 (2) | 2025.08.10 |
| 14. 경사하강법(Gradient Descent) (3) | 2025.08.09 |