본문 바로가기
카테고리 없음

《처음 만나는 머신러닝과 딥러닝》C로 작성한 귀납학습 예제 실습

by 팁텍북 2017. 11. 28.

《처음 만나는 머신러닝과 딥러닝》C로 작성한 귀납학습 예제 실습

귀납학습 예제를 실습해보았습니다.


1. 헤더파일을 넣고, 기호상수를 정의한다음 함수 프로토타입을 선언합니다.

2. 이후 학습데이터의 집합들을 읽어들이고 해답 후보 패턴 점수를 계산합니다.

이때, rand012는 난수를 발생시킵니다.

3. 해답 후보를 생성하고 검사하여 가장 좋은 점수로 갱신하여 

최종에는 가장 좋은 해답을 출력해줍니다.


#include <stdio.h>
#include <stdlib.h>

/* 기호 상수 정의 */
#define OK 1
#define NG 0
#define SETSIZE 100 /* 학습 데이터 세트의 크기 */
#define CNO 10 /* 학습 데이터의 자릿수(10회사 분) */
#define GENMAX 10000 /* 해답 후보 생성 횟수 */
#define SEED 32767 /* 난수 시드 */

/* 함수 프로토타입 선언 */
void readdata(int data[SETSIZE][CNO],int teacher[SETSIZE]) ;
/* 학습 데이터 세트를 읽어들임 */
int rand012() ;/*0, 1 또는 2를 반환하는 난수 함수 */
int calcscore(int data[SETSIZE][CNO],int teacher[SETSIZE],
int answer[CNO]) ;
/* 해답 후보 패턴의 점수(0~SETSIZE점)의 계산 */

/****************/
/* main() 함수 */
/****************/
int main()
{
int i, j;
int score = 0;/* 점수(0~SETSIZE점)*/
int answer[CNO];/* 해답 후보 */
int data[SETSIZE][CNO];/* 학습 데이터 세트 */
int teacher[SETSIZE];/* 교사 데이터 */
int bestscore = 0;/* 가장 좋은 점수 */
int bestanswer[CNO];/* 탐색 중 찾은 가장 좋은 점수 */

srand(SEED);/* 난수 초기화 */

/*학습 데이터 세트를 읽어들임 */
readdata(data,teacher) ;

/* 해답 후보 생성과 검사 */
for (i = 0; i<GENMAX; ++i) {
/* 해답 후보 생성 */
for (j = 0; j<CNO; ++j) {
answer[j] = rand012();
}

/* 검사 */
score=calcscore(data,teacher,answer) ;

/* 가장 좋은 점수로 갱신 */
if (score>bestscore) {/* 지금까지 가장 좋은 점수라면 갱신 */
for (j = 0; j<CNO; ++j)
bestanswer[j] = answer[j];
bestscore = score;
for (j = 0; j<CNO; ++j)
printf("%1d ", bestanswer[j]);
printf(":score=%d\n", bestscore);
}
}
/* 가장 좋은 해답 출력 */
printf("\n가장 좋은 해답\n");
for (j = 0; j<CNO; ++j)
printf("%1d ", bestanswer[j]);
printf(":score=%d\n", bestscore);

return 0;
}

/**********************************************/
/* calcscore() 함수 */
/* 해답 후보 패턴의 점수(0~SETSIZE점) 계산*/
/**********************************************/
int calcscore(int data[SETSIZE][CNO],int teacher[SETSIZE],
int answer[CNO])
{
int score = 0;/* 점수(0~SETSIZE점)*/
int point ;/* 일치한 자릿수(0~CNO) */
int i,j ;
for (i = 0; i<SETSIZE; ++i) {
/* 일치도 계산 */
point = 0;
for (j = 0; j<CNO; ++j) {
if (answer[j] == 2) ++point;/* 와일드카드 */
else if (answer[j] == data[i][j]) ++point;/* 일치 */
}

if ((point == CNO) && (teacher[i] == 1)) {
++score;
}
else if ((point != CNO) && (teacher[i] == 0)) {
++score;
}
}
return score ;
}

/****************************/
/* readdata() 함수 */
/*학습 데이터 세트를 읽어들임 */
/****************************/
void readdata(int data[SETSIZE][CNO],int teacher[SETSIZE])
{
int i,j ;
for (i = 0; i<SETSIZE; ++i) {
for (j = 0; j<CNO; ++j) {
scanf("%d", &data[i][j]);
}
scanf("%d", &teacher[i]);
}
}

/****************************/
/* rand012() 함수 */
/* 0, 1 또는 2를 반환하는 난수 함수 */
/****************************/
int rand012()
{
int rnd ;
/* 난수의 최댓값을 제외 */
while((rnd=rand())==RAND_MAX) ;
/* 난수 계산 */
return (double)rnd/RAND_MAX*3 ;
}



위의 코드는 프리렉에 가시면 내려받을 수 있는 공개된 내용입니다.

고맙습니다.^^


#사이언스올 #과학 #우수과학도서 #리더스리더

댓글