정보과학융합탐구

7. one- hot encoding

Quettabyte 2023. 5. 11. 23:26

이번 글에서는 저번 자연어 처리 글과 관련되어 있는 하나의 주제인 one-hot encoding                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             에 대하여 알아보고 코딩으로 구현해보려고 합니다.

-원핫 인코딩이란?
범주형 데이터를 수치데이터(벡터)로 바꾸는 방법
ex) 빨강, 파랑, 초록이 있을때
빨강[1,0,0]
파랑[0,1,0]
초록[0,0,1]

*범주의 수가 많아지면 벡터의 차원이 증가하기 때문에 메모리와 연산 비용이 증가하게 되기 때문에 범주의 수가 적은 경우에 적합한 방식입니다.
또한, 단어간의 유사성을 알 수가 없기 때문에 검색 시스템 등에서 효율성이 떨어질 수 있다.

이 원핫 인코딩을 코딩으로 한 번 구현해 보겠습니다.

다음과 같이 알고리즘을 설계하고 C를 활용하여 코드를 구성해보았습니다.

#include <stdio.h>
#include <string.h> //strcmp 이용을 위하여

int main(){
    
    char categories[10][10] ={  //데이터의 최대 개수 10개, 최대 길이 10자
        "red", "blue", "green", "black", "white"
    };
    
    int num =5;
    
    int category_index;  // 입력받은 데이터의 인덱스를 저장
    
    // 각 데이터에 해당하는 원핫 벡터를 배열에 저장
    int vector[10][10];
    
    // 벡터를 0으로 초기화
    for (int i =0;i <num; i++){
        for (int j= 0; j<num;j++){
            vector[i][j] =0;
        }
    }
    
    // 사용자로부터 입력 받기
    printf("보기 중의 데이터를 입력하세요 :\n");
    char c[10];
    fgets(c,10,stdin);
    
    
    // 입력받은 데이터의 인덱스 찾기
    for (int i=0; i<num;i++){
        if (strcmp(categories[i], c) == 0){
            category_index= i;
            break;
        }
    }
    
    // 원핫 벡터 생성
    for (int i = 0; i < num; i++){
        if (i == category_index){
            vector[category_index][i]= 1;
        }
    }
    
    // 출력
    printf("One-hot vector:\n");
    for (int i = 0; i < num; i++){
        if (i== category_index){
            for (int j=0;j<num;j++){
                printf("%d ", vector[i][j]);
            }
        }
    }
    
}

이 코드 실행 시 사용자는 주어진 red, green, blue, black, white 중 하나를 입력하게 됩니다. 그러면 이에 해당하는 인덱스의 데이터를 찾아 미리 생성되어 있는 원핫 벡터를 출력하게 됩니다.  코드에서 최대 데이터의 개수, 최대 길이, 데이터의 개수를 변경할 수 있습니다.

어려웠던 점은 데이터를 입력받고 그 데이터를 원래의 데이터와 비교하여 인덱스를 찾아내는 과정을 어떻게 표현할 수 있을지 고민이 되었던것 같습니다. 그때 strcmp라는 함수가 생각이 났습니다. 이 함수를 이용하면 문자열 간의 비교를 손쉽게 할 수 있어서 바로 사용하게 되었습니다.

제 짧고 부족한 글을 읽어주셔서 감사합니다^

'정보과학융합탐구' 카테고리의 다른 글

14. diff - svc에 대하여  (0) 2023.07.04
11. 가우스 함수 그래프  (0) 2023.05.30
10. 해외 이공계 체험 학습 후기  (0) 2023.05.30
6. 자연어 처리(nlp)  (0) 2023.05.11
3. MSE, MAE를 C로 구현해보자!!  (0) 2023.03.13