[4차산업혁명 융·복합과목]  

 


    인공지능을 위한 기초수학  교재 다운(Down),  Math & Coding [Down]

 

   Basic Mathematics for Artificial Intelligence

  

             이 상 구  with 이재화



Version 1    Dec. 2nd, 2019     

 

http://sage.skku.edu  http://www.sagemath.org

 

          http://matrix.skku.ac.kr/math4ai/

 

 

Part Ⅰ. 행렬과 데이터분석

                         http://matrix.skku.ac.kr/math4ai/part1/

 

Part Ⅱ. 다변수 미적분학과 최적화

                        http://matrix.skku.ac.kr/math4ai/part2/

 

Part Ⅲ. 확률통계와 빅데이터

                         http://matrix.skku.ac.kr/math4ai/part3/

 

Part Ⅳ. 빅데이터와 인공지능

                         http://matrix.skku.ac.kr/math4ai/part4/

 

SKKU 2019 Fall 학부 <인공지능을 위한 기초수학> Basic Math for AI

 

인공지능을 위한 기초수학 [0] [입문: Dummy를 위한 인공지능], Basic Math for AI [첫 강의] 0 https://youtu.be/VZbv6BG-xIY

 

인공지능을 위한 기초수학 1(강의운영 소개), Basic Math for AI 1 https://youtu.be/IkQxe1izELM

인공지능을 위한 기초수학 2(선형대수학 1: Big Picture, 벡터, 정사영, 최단거리), Basic Math for AI 2 https://youtu.be/UdCJCk2MWDU

인공지능을 위한 기초수학 3(선형대수학 2: 선형연립방정식, 행렬과 행렬식), Basic Math for AI 3 https://youtu.be/qwQX_zPIlCU

 

인공지능을 위한 기초수학 4(선형대수학 3: 기저, 차원), Basic Math for AI 4 https://youtu.be/UHqhruN38ps

인공지능을 위한 기초수학 5(선형대수학 4: 최소제곱해, QR분해), Basic Math for AI 5 https://youtu.be/5r2KghYFw2w

인공지능을 위한 기초수학 6(선형대수학 5: 선형변환), Basic Math for AI 6 https://youtu.be/_t871V2CDSw

 

 

인공지능을 위한 기초수학 7(선형대수학 6: 행렬의 대각화), Basic Math for AI 7 https://youtu.be/d8KE1QpKiDo

인공지능을 위한 기초수학 8(선형대수학 7: SVD), Basic Math for AI 8 https://youtu.be/e0IoDqJLB8U

인공지능을 위한 기초수학 9(선형대수학 8: 이차형식), Basic Math for AI 9 https://youtu.be/rCNBWT0r5mA

 

인공지능을 위한 기초수학 10(미적분 1: 극한과 도함수), Basic Math for AI 10 https://youtu.be/rsltpfMbtBQ (New)

인공지능을 위한 기초수학 11(미적분 2: 미분의 응용), Basic Math for AI 11 https://youtu.be/O4lN5zEZnMA

인공지능을 위한 기초수학 12(미적분 3: 적분), Basic Math for AI 12 https://youtu.be/62OxYG7VMsE

 

인공지능을 위한 기초수학 13(미적분학 4: 다변수함수), Basic Math for AI 13 다변수함수와 미적분 https://youtu.be/XQW8_8k9GjE

인공지능을 위한 기초수학 14(미적분학 5: 편도함수와 그래디언트), Basic Math for AI 14 https://youtu.be/cvsBYZT4SZg

인공지능을 위한 기초수학 15(미적분학 6: 함수의 극대, 극소), Basic Math for AI 15 https://youtu.be/nR9it9cBjDk

 

인공지능을 위한 기초수학 16(미적분 7: Gradient Descent Algorithm), Basic Math for AI 16 경사하강법 https://youtu.be/XWDPAdKhq-Q

인공지능을 위한 기초수학 17(미적분 8: 중적분), Basic Math for AI 17 https://youtu.be/T1z_GYt85rI

 

인공지능을 위한 기초수학, Midterm PBL 학생 발표 1, 최진호 https://youtu.be/0iBPdFEXzqM

인공지능을 위한 기초수학, Midterm PBL 학생 발표 2, 황태식, 엄지민, 김명준, 유대청, 박지원, https://youtu.be/rfJCDksmJBk

인공지능을 위한 기초수학, Midterm PBL 학생 발표 3, 김두영, 최준오, 민성현, https://youtu.be/TAvIor-BbhI

인공지능을 위한 기초수학, Midterm PBL 학생 발표 4, 송소영, https://youtu.be/0L484fWUZz0

인공지능을 위한 기초수학, Midterm PBL 학생 발표 5, 김성현, 이재형, 조민규, https://youtu.be/yCC8l0plqXI

 

인공지능을 위한 기초수학 18(통계 1: 통계학과 R), Basic Math for AI 18 https://youtu.be/u82BC1RiJ0A

인공지능을 위한 기초수학 19(통계 2: 순열, 조합, 확률), Basic Math for AI 19 https://youtu.be/KQXO-XbJauU

인공지능을 위한 기초수학 20(통계 3: 확률변수), Basic Math for AI 20 https://youtu.be/SUsZHarQqqg

인공지능을 위한 기초수학 21(통계 4: 이산확률분포), Basic Math for AI 21 https://youtu.be/Fq7D7bGG_cE

인공지능을 위한 기초수학 22(통계 5: 연속확률분포), Basic Math for AI 22 https://youtu.be/4wx1raETI8o

인공지능을 위한 기초수학 23(통계 6: 공분산과 상관계수, 데이터 활용의 실제), Basic Math for AI 23 https://youtu.be/oUSPhkyEWp4

 

인공지능을 위한 기초수학 24(빅데이터와 인공지능 1, 개론), Basic Math for AI 24 https://youtu.be/MpWv-U_4fl0

인공지능을 위한 기초수학 25(빅데이터와 인공지능 2, PCA), Basic Math for AI 25 https://youtu.be/ukIttphmM_4

인공지능을 위한 기초수학 26(빅데이터와 인공지능 3, 신경망), Basic Math for AI 26 https://youtu.be/D_oCT-tEW_4

인공지능을 위한 기초수학 27(빅데이터와 인공지능 4, MNIST), Basic Math for AI 27 https://youtu.be/UqmV4wEzKIY

인공지능을 위한 기초수학 28(빅데이터와 인공지능 5, Project), Basic Math for AI 28 https://youtu.be/EKkr3EkDV3M

 

****

[창의재단 Talk] 수학교육과 인공지능(AI) by 이상구 https://youtu.be/-emrYxyde-M

[한양대 Talk] Math for Big Data / Machine Learning / AL https://youtu.be/yZlIoZvYIOo

 

서문

 

인공지능(Artificial Intelligence, AI)은 우리의 곁에 아주 가까이 다가와 있다. 우리는 우리 삶의 거의 모든 곳에서 인공지능이 우리와 대화하고(Siri), 우리가 무엇을 보고 무엇을 구매할 지를 추천 해주며(Netflix, Amazon), 가계와 금융에 관하여 조언을 해주고(SchwabIntelligent Portfolio), 퀴즈를 풀며, 환자의 병명을 전문가 보다 더 빠르고 정확한 답을 구해주고(IBMWatson), 법원의 판례를 찾아주고, 바둑의 고수를 이기는 것을(AlphaLaw, AlphaGo) 보았다. 또한 GoogleFacebook이 딥러닝을 기반으로 음성인식, 얼굴인식 및 무인 자율주행 자동차(Autonomous Vehicle)를 소개하고 있으며, 그 외에도 기계가 우리의 언어로 우리와 의사소통 할 수 있도록, 자연어 이해 및 생성(Quill)을 향상시키는 것을 목표로 하는 일들이 진행 중이다. 인공지능은 추구하고자 하는 목표와 기능에 따라 인지 컴퓨팅, 스마트 머신, 머신러닝, 자연어 생성, 음성인식, 튜링 테스트, 로봇비서, 예측 분석, 추천 시스템, 딥러닝, 자율주행 차, 질문-답변 시스템, 자연어 생성 플랫폼 등등 여러 가지 화려한 이름으로 불리고 있다.

 

우리는 인공지능 로봇이 앞으로 다양하고 힘든 일을 우리 대신 실제로 해줄 것을 이미 잘 알고 있다. 이미 공장, 도로, 심지어 집에서도 로봇이 우리를 위해 일하고 있으며, 미래에 인공지능 로봇이 직장에서의 우리 업무까지 대신하게 되면, 우리는 출근할 이유도 없어질지 모른다. 따라서 인공지은 로봇은 우리에게 죽음, 노예화 또는 영구적인 실업을 줄 가능성도 있다. 그러나 우리는 인공지능에 대해 무작정 두려워하기보다 인공지능이 도대체 무엇인지 그리고 어떻게 작동되는지 기본 원리를 이해 할 필요가 있다. 우리는 이 책에서 인공지능이 작동하도록 만드는 기본 원리에 필요한 수학적 기초 지식을 제공하려고 한다.

                    

머리말


 

『인공지능을 위한 기초수학』은 대학생을 대상으로 인공지능에 필요한 수학을 선별하여 한 학기 강의용으로 만든 교재이다. 이 책은 처음부터 끝까지 인공지능(머신러닝, 딥러닝)을 이해하는데 필요한 수학적 개념과 계산능력을 갖추도록 하는데 집중하고 있다. 먼저, 인공지능의 알고리즘을 이해하는 데 필요한 최소한의 수학 개념을 고교, 대학 수학 과정의 수준으로 설명하고, 이 개념들이 실제로 인공지능을 개발할 때 어떻게 쓰이는지, 잘 알려진 예와 알고리즘을 이용하여 쉽게 설명한다. 본 교재는 인공지능 이해에 필수적인 수학 콘텐츠인 선형대수학, 다변수 미적분학, 기초 통계와 확률, SVD, 주성분 분석(PCA) 및 그래디언트 알고리즘과 파이썬 및 R 코드를 포함하는 내용으로 구성된다. 특히 수학적인 이론, 풀이와 함께 관련 파이썬(Python) 및 R 코드를 교재에 제공하고, 클라우드 컴퓨팅 실습실을 활용하여, 어렵지 않게 복잡한 계산과 데이터 처리 및 시각화를 직접 수행하면서 학습할 수 있도록 한다.

 

                

         [칼럼] 알파고, 인공지능, 그리고 수학  (카이스트 전기 및 전자공학부 김준모 교수)

         https://mathsci.kaist.ac.kr/newsletter/article/%ED%8A%B9%EB%B3%84%EA%B8%B0%EA%B3%A0-%EC%95%8C%ED%8C%8C%EA%B3%A0-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%88%98%ED%95%99/

         [칼럼] 인공지능과 수학은 무슨 상관이 있을까?  (서강대 수학과 김종락 교수)

                  https://m.post.naver.com/viewer/postView.nhn?volumeNo=11808498&memberNo=36498508

2016년 3월 알파고와 이세돌의 바둑 대전에서 이세돌의 승리를 예측하는 사람들이 많았지만 놀랍게도 4대1로 패하고 말았다. 이후 알파고를 비롯한 인공지능 컴퓨터에 대하여 모두가 큰 관심을 갖게 되었다. “알파고 안에 어떤 알고리즘이 숨어 있을까?” 기보를 학습하는 것은 어디까지나 출발선에 불과한 것이고, 기보 학습에서 시작하여 알파고 간의 끊임없는 대국을 통해 스스로의 능력을 강화할 수 있다는 것이 알파고의 무서운 점이다. 아마추어의 기보를 학습하여 아마추어의 수준에 머무는 것이 아니라 이를 출발점으로 시작해서 프로 9단과 인간계 바둑의 한계를 돌파할 수 있는 것이 알파고의 위력인 것이다.


인공지능을 처음 연구한 사람은 영국의 수학자 앨런 튜링이라고 알려져 있다. 2차 세계대전에서 독일군의 암호를 해석해 유명해진 튜링은, ....


[인공지능과 수학은 무슨 상관이 있을까?] 4차 산업혁명의 핵심 기술요소로 인공지능을 지목하고 있다, 우리는 이를 받쳐주는 수학적 이론들에 대해서 생각할 것이다. ...  딥러닝은 인간의 뇌를 흉내 낸 인공신경망을 여러 층으로 분리하여 학습하는 인공지능 기법 중 하나인데, 선형 함수보다 복잡한 비선형 함수를 포함하여 복잡한 데이터를 설명한다. 그 동안 딥러닝이 가장 큰 성과를 거둔 문제로는 음성 인식과 영상 인식(Video-to-video Synthesis)을 들 수 있고, 최근에는 자연어 처리와 이해에서 많은 발전이 이루어지고 있다. [예, Google’s  BERT (Bidirectional Encoder Representations from Transformers) representation, Improving word embeddings, Modeling the structure of space of visual tasks, Fine-tuning the universal language model for text classification, medical diagnosis, stock trading, robot control, law, scientific discovery and toys, Human-level artificial general intelligence (AGI)]


딥러닝, 기계학습, 인공지능은 응용수학 분야라고 할 만큼 수학이 매우 광범위하게 활용되고 있다. 딥러닝에서의 학습은 훈련 데이터가 제시하는 연습 문제를 잘 해결하는 방향으로 신호를 전달하는 연결 지점에서 연결 강도를 변경하면서 이루어지는데, 이때 연결 강도를 어떻게 변경해야 할지를 선형대수학과 다변수 함수의 편미분을 사용하여 구한다. 또한 기계학습 전반에 걸쳐서 다양한 종류의 최적화 문제가 등장하며 최적화 이론이 많이 활용된다. 딥러닝과 기계학습 그리고 인공지능의 발전을 이해하고 기여하기 위하여 필요한 수학적 기초 지식을 배워 둘 필요가 있을 것이다. 



[읽을거리]  2019년 7월 영국 50파운드(약 7만4000원) 지폐 뒷면 초상인물로 요절한 천재 수학자 앨런 튜링(1912~1954)이 선정되었다.  

                

[그림 출처]  https://www.bankofengland.co.uk/banknotes/50-pound-note-nominations

 

탁월한 수학자인 튜링은 인공지능(AI)의 아버지로, 또 전쟁 영웅으로 광범위하면서 선구자적인 기여를 했다. 튜링은 1936년 ‘보편적 기계’ 개념을 창안해 AI 기틀을 마련했으며, 기계가 인간과 얼마나 비슷하게 대화할 수 있는지를 기준으로 ‘기계의 사고 능력’을 판별하는 ‘튜링 테스트’를 만들었다. 튜링은 1936년부터 1938년까지 미국 프린스턴대 대학원에서 <서수에 근거한 논리시스템>를 연구하고 수학박사학위를 받았다. 이때 튜링은 체스게임 같이 복잡한 계산 능력을 필요로 하는 연산을 포함하는 많은 계산을 수행할 수 있는 기계는, 숫자와 부호의 이진법으로 작동해야만 한다는 아주 친숙한 개념을 처음으로 발견하였다. 오늘날 우리는 그것을 ‘튜링 머신(Machine)’이라고 부른다. 튜링이 수학적이고 논리적인 발견을 바탕으로 착안한 것은 전자두뇌와 인공지능기계였고, 그는 그것을 현실화시켰다. 그는 아울러 제2차 세계대전 당시 독일 잠수함 암호기 ‘에니그마’를 해독했다. 튜링은 2차 세계대전에서 연합군 승리에 기여했지만, 1952년 당시 영국에서 범죄로 취급하던 동성애 혐의로 기소됐다. 수감되지는 않았지만 화학적 거세를 당한 튜링은 1954년 41세에 청산가리를 주입한 사과를 먹고 스스로 목숨을 끊은 것으로 추정된다. 튜링이 베어 먹은 사과가 미국 애플사 로고의 모티브를 제공했다는 설이 있으며, 미국컴퓨터학회(ACM)는 그를 기념해 1966년 튜링상을 제정했다. 컴퓨터 과학 분야에 기여한 인사에게 시상하고 있다. 그는 아카데미 각색상을 받은 영화 ‘이미테이션 게임’의 실제 모델로 화제가 되기도 했다.


[참고 : https://www.mk.co.kr/news/society/view/2019/07/528841/ 김덕식 기자, 매일경제]

튜링(Alan Turing, 1912~1954) - 컴퓨터의 아버지, 최초의 해커

https://www.nature.com/news/turing-at-100-legacy-of-a-universal-mind-1.10065 

http://dongascience.donga.com/news.php?idx=-5426053

 

 

 

Contents

 

머리말

Python/Sage/R 언어 사용법 

수학과 코딩


Part Ⅰ. 행렬과 데이터분석

0. Big Picture

1. 벡터

2. 선형연립방정식

3. 행렬과 행렬식

4. 일차독립과 기저 및 차원

5. 선형변환

6. 고유값, 고유벡터, 대각화

7. SVD (특이값 분해)

8. 이차형식(quadratic form)


 

 

Part Ⅱ. 다변수 미적분학과 최적화

1. 일변수함수와 미적분

2. 다변수함수와 미적분

[부록 1] 미적분학의 상호연관성(Calculus Map)

[부록 2] 미적분학용 Sage/Python 코드

[부록 3] 미적분학 공식과 표(Table)


 

 

Part Ⅲ. 확률통계와 빅데이터

0. 통계학과 R

1. 순열, 조합, 확률

2. 확률변수

3. 확률분포

4. 데이터 활용의 실제

[부록 4]  기초통계 개념


Part Ⅳ. 빅데이터와 인공지능

1. 주성분분석

2. 신경망

3. 학생 프로젝트 사례

읽을거리 1:  선형대수학과 구글(Google) 검색엔진

읽을거리 2:  인공지능, 인간을 뛰어넘은 비밀

[부록 5] 이산수학

읽을거리 3:  인공지능과 AI를 활용한 안면 인식기술

읽을거리 4

 

 

 

0-1. Python/Sage/R 언어 사용법 


우리는 이 책에 수록된 연산 문제(CAS)를 해결하기 위해 Sage/Python 도구를 사용한다. Python/Sage/R을 사용하는 SageMath는 Matlab이나 Maple, Mathematica와 같은 고가의 소프트웨어를 따로 설치하지 않아도 (인터넷 접속만 된다면) 언제 어디서든 (크롬 브라우저 등을 이용하여) 사용할 수 있는 수학 연산용 도구이다.


❚ Sage Cell 서버 : http://sage.skku.edu  (바로 연결하여 로그인 없이 모바일로 사용가능)


❚ Sage 노트북 서버    https://youtu.be/cx6cx788aHc

[그림 1]은 한국방송통신대 프라임칼리지에서 운영 중인 Sage 노트북 서버(http://sage.knou.ac.kr)이다. 여기에서는 Sage 노트북(Notebook) 서비스를 이용하는 방법을 설명할 것이다. 먼저 이 서버를 사용하기 위해서는 계정이 필요하므로 먼저 계정을 만들고, 메인 화면의 메뉴 및 워크시트 사용법을 살펴보기로 한다. 그런 다음 Sage 명령을 입력하여 결과를 확인보고, 마지막으로 워크시트를 저장하고 종료하는 방법을 살펴볼 것이다.

        

Sage Cell 서버 :

http://sage.skku.edu

         

[그림 1] Sage 노트북 서버


(1) 계정 만들기

① Sage와 호환성이 좋은 크롬 브라우저

(https://www.google.com/chrome/browser/desktop/index.html) 또는 파이어폭스

(https://www.mozilla.org/ko/firefox/new/) 또는 사파리 브라우저를 설치한다.

② 수학사이버랩 연산서버(http://sage.knou.ac.kr)에 접속한 후 [수학 사이버랩 연산서버 계정 가입하기(New Account)] 링크를 클릭하면 [그림 2]와 같은 화면이 나온다.

        

                      [그림 2] Sage 노트북 계정 가입을 위한 화면


③ 사용자 이름(ID), 사용자 암호, 설정된 암호를 재입력한 후 버튼을 누르면 계정이 만들어진다. 이제 생성한 ID, 암호를 이용하여 개인 계정을 이용할 수 있다.


(2) Sage 노트북의 메인 화면 살펴보기

생성한 ID와 암호를 입력한 후 로그인하면 [그림 3]과 같은 화면이 나온다.

      

                       [그림 3] Sage 노트북 메인 화면

메인 화면에 보이는 메뉴 중에서 자주 쓰이는 항목은 다음과 같다.


: Sage 노트북 메인 화면으로 돌아가기

공개된 워크시트 : 공개된 워크시트 확인하기

설정 : 자동 저장간격 및 사용자 계정 정보 수정하기

로그아웃 : Sage 노트북 종료하기

새 워크시트 : 새로운 워크시트 작성

업로드 : Sage 워크시트 파일(sws 형식) 업로드하기

: 선택한 Sage 워크시트 다운로드(sws 형식)


(3) Sage 노트북의 워크시트 화면

새로운 워크시트를 작성하기 위해  <새 워크시트>를 누르면 [그림 4]와 같이 워크시트 이름을 입력하는 창이 나타난다. 적당한 워크시트 이름을 입력한 후 버튼을 클릭하면 [그림 5]와 같이 Sage 명령어를 입력하여 실행시킬 수 있는 Sage 노트북 워크시트 화면을 확인할 수 있다.

       

                [그림 4] Sage 노트북 워크시트 이름 입력하기

       

                [그림 5] Sage 노트북 워크시트 화면


워크시트 화면에 보이는 메뉴 중에서 자주 쓰이는 항목은 다음과 같다.


: 워크시트 저장, 워크시트 저장 후 종료, 워크시트 저장을 하지 않은 채로 종료

: sws 파일 업로드, 새 워크시트 작성, 현재 워크시트 다운로드,
              인쇄, 워크시트 이름 바꾸기, 워크시트 복사, 워크시트 삭제

: 연산 강제 종료, 워크시트 재시작, 워크시트 저장 후 종료,
             
Sage 명령어 전부 실행, 결과 숨기기, 결과 보이기, 결과 지우기

: Sage 노트북 서버에 활용할 각종 파일 업로드 기능

:  Sage, GAP, GP, Python, R 명령어 실행 설정

: 현재 워크시트를 html 형식으로 공개


(4) Sage 명령어의 입력 및 실행

[그림 6]과 같이 빈 칸에 Sage 명령어를 입력하고 버튼을 누르면 그 결과를 확인할 수 있다.

                        

[그림 6] Sage 명령어 입력 및 실행 결과


이때 결과화면 아래쪽으로 마우스를 가져가면 [그림 7]과 같이 파란색 선을 확인할 수 있다. 이 선을 마우스로 클릭하면 Sage 명령어를 입력할 수 있는 새로운 셀(Cell)을 추가할 수 있다.

              

                           [그림 7] 새로운 Sage 셀 추가하기


또는 㰍¬ 버튼을 누른 채 마우스의 왼쪽 버튼으로 파란색 선을 클릭하면 [그림 8]과 같이 HTML 설명을 추가할 수 있는 텍스트 박스를 열 수 있다. 이 텍스트 박스에서는 다양한 서식과 수식을 이용하여 결과 화면에 설명을 추가할 수 있다. 버튼을 클릭하면 입력한 설명들이 화면에 나타나며, 그 설명을 마우스로 더블클릭하면 다시 텍스트 박스를 열어 내용들을 수정할 수 있다.

              

                    [그림 8] HTML 설명을 추가할 수 있는 텍스트 박스


(5) Sage 명령어 도움말 사용하기

특성 명령어의 사용법을 알고 싶을 때는 명령어 뒤에 “?”를 붙이거나 “help(Sage 명령어)” 입력하고 버튼을 누르면 [그림 9]와 같이 자세한 사용 방법을 보여준다.

  

[그림 9] Sage 명령어 튜토리얼


또한 길이가 긴 Sage 명령어를 입력할 때 혹은 명령어 사용방법이 잘 떠오르지 않는 경우에는 명령어 자동완성 기능을 사용하기를 권한다. 예를 들어, “plot”을 입력한 후 <TAB> 키를 누르면 [그림 10]과 같이 “plot”으로 시작하는 모든 Sage 명령어를 확인할 수 있다.

    

[그림 10] Sage 명령어 자동완성 기능

    

[그림 11] 3D 그래프 예시


3D 관련 명령어는 https://sagecell.sagemath.org/ 에서 실행하면 된다([그림 11] 참조).


(5) 워크시트 저장 및 공개, 종료

앞서 작성한 Sage 워크시트는 버튼들을 활용하여 저장하거나 종료시킬 수 있다. 또한 버튼을 클릭하여([그림 12] 참조) 해당 내용을 [그림 13]과 같이 HTML 형식으로 웹상에 공개할 수도 있다. 이렇게 공개된 자료는 별도의 Sage 노트북 서버에 로그인을 하지 않아도 웹을 통해 확인할 수 있다. (참고로 수업을 통해 작성 및 공개된 워크시트를 http://math1.skku.ac.kr/pub/에서 확인할 수 있다.)


    

[그림 12] 워크시트 공개하기

    

[그림 13] 웹 상에 공개된 워크시트


❚ 예제 및 연습문제 실습실

이 책의 본문에는 CAS 예제 및 연습문제에 대해 코드-실행결과를 보여주고 있다. 실제로 학습자들이 코드를 실행해보고, 필요에 따라 수정해볼 수 있도록 본문에 수록된 CAS 예제 및 연습문제 실습실을 구성했다. 실습실을 활용하는 방법은 Sage 노트북과 같지만, 별도로 계정을 만들거나 로그인할 필요는 없다. 본문의 코드가 기본적으로 입력되어 있어 학습자의 시간을 절약할 수 있게 했다.


[기본] 이미 주어진 실습 문제의 코드를 살펴본 후, [실행(Evaluate)] 버튼을 클릭하여 결과를 확인한다.

    

[그림 14] 실습실 활용하기 ①


[활용] 새로운 문제에 맞게 숫자, 함수 또는 코드를 수정하고, [실행(Evaluate)] 버튼을 클릭하면 새로운 결과를 얻는다. 예를 들어, ① 미분방정식 또는 ② 초기 조건을 수정하여 실습할 수 있다.


    

[그림 14] 실습실 활용하기 ②

0-2.  수학과 코딩! [수학동아 2019년 연재]

                      http://matrix.skku.ac.kr/2018-album/Math-Coding.htm 

        

내용 감수 : 성균관대학교 이상구 교수 (現 한국수학교육학회장)

수학동아 Math & Coding 연재

 http://dl.dongascience.com/magazine/view/M201901N012

[Junior Polymath] 주니어 폴리매스

[순열과 조합]  http://www.polymath.co.kr/mini/1330

in  http://www.polymath.co.kr/mini?category_id=15&ready_focus=newlist

글 : 이재윤 연구원( toed00@gmail.com )


여러분들은 원의 넓이를 구하는 공식을 잘 알고 있을 거예요. 그런데 적분이 원의 넓이를 구하는 방법에서 출발하였다는 사실, 알고 계신가요?


    

아르키메데스

  먼저, 우리가 현재 알고 있는 원의 넓이를 구하는 공식인 은 고대 그리스 시대의 수학자 아르키메데스에게서 시작되었어요. 그는 정다각형이 충분히 많은 변을 가질수록 원에 가까워진다는 점을 생각해 내었는데, 놀랍게도 이를 이용하여 원주율 의 매우 정밀한 근사값인 3.1416을 계산해 내었을 뿐만 아니라 원의 넓이를 구하는 공식인 를 수학적으로 증명하였답니다.




레오나르도 다빈치

 

이후에 르네상스 시대의 유명한 화가이자 과학자인 레오나르도 다빈치는 아르키메데스의 방법을 좀 더 쉽게 이해할 수 있도록 설명하였어요. 원을 충분히 많은 조각으로 쪼갠 다음, 옆의 그림과 같이 엇갈려 이어붙이면 밑변 그리고 높이 인 직사각형으로 만들 수 있어요. 그러면 이 직사각형의 넓이는 [밑변] ☓ [높이] 인 이 됩니다.

출처: Wolfram Mathworld



케플러




출처: Matematicas Visuales

그렇다면, 현재 우리가 사용하고 있는 적분의 개념은 언제 등장하였을까요? 17세기 수학자이자 천문학자인 케플러는 아르키메데스의 방법에서 아이디어를 얻어, 포도주통을 원판(Disk)들로 채워서 계산하였는데 이는 현재 우리가 사용하고 있는 적분의 개념과 동일해요.



(케플러가 살던 시기, 포도주의 가격은 포도주 통 안에 막대를 넣어 포도주가 채워져 있는 높이를 재서 결정하였는데, 중간이 볼록한 포도주 통의 모양 때문에 통에 채워진 포도주의 높이와 실제 양이 정확히 비례하지 않았음)


적분의 기본개념을 이해하였으니, 이제 간단한 코딩으로 수학문제를 쉽게 해결해 봅시다.


(BOX) 수학 코딩해보기



➀ 구간 (0, 5)에서 함수 의 그래프를 그려보자.

 

var('x') 

f = -x^2+4*x+1

plot(f, x, (0,5))      #구간: 0부터 5까지, 함수: -x^2+4*x+1

②  구간 (0, 4)에서 함수 의 그래프와 축이 만드는 영역을 살펴보자.

 

var('x') 

f = -x^2+4*x+1

plot(f, x, (0,4), fill="axis")   


③ 적분 명령어를 이용하여 (0, 4) 구간에서  의 그래프와 축이 이루는

넓이, 즉 적분값을 구하면?

 

var('x') 

f = -x^2+4*x+1

integral(f, x, 0, 4)


계산값: 44/3


구간 (0, 4)에서 함수 의 그래프를 축에 대하여 회전시킨 회전체를 그려보자

 

var('x') 

f = -x^2+4*x+1

revolution_plot3d(f,(x,0,4), parallel_axis='x')

            

➄ 앞에서 그린 회전체의 부피를, 적분을 통해 구해보자.

 

var('x') 

f = -x^2+4*x+1

integral(pi*f^2, x, 0, 4)     # pi는 원주율

 

  계산값: 892/15*pi

  수식을 살펴보면, 구간 (0, 4)에서 원의 넓이를 구하는 공식 을 이용하여 계산하였다,

  즉, 케플러가 제시한 방법과 개념적으로 일치한다.

 


⑥ 회전체와 적분값을 같이 살펴보자.

 

var('x') 

f = -x^2+4*x+1

A=revolution_plot3d(f,(x,0,4), parallel_axis='x')

B=integral(pi*f^2, x, 0, 4)     # pi는 원주율

show(A)

show(B)

 

 

행렬과 연립방정식


이번에 코딩으로 정복해 볼 수학 개념은 ‘1차 연립방정식’입니다. 1차 연립방정식은 미지수가 2개 이상인 1차 방정식의 모임을 뜻해요. 보통 미지수가 하나인 1차 방정식은 등식의 성질을 이용해 쉽게 해를 구할 수 있지만, 연립방정식은 방정식을 서로 더하거나 빼서 미지수를 하나로 만든 뒤 해를 구하는 ‘소거법’으로 해를 구하지요.

소거법으로 미지수가 무척 많은 연립방정식의 해를 구하려면 시간이 오래 걸리기 때문에 보통 ‘행렬’을 이용합니다. 행렬은 수를 행과 열에 맞춰 나열해 놓은 것으로, 특히 행 또는 열 1개로 이뤄진 행렬을 ‘벡터’라고 불러요.

연립방정식을 구성하는 식은 모두 같은 미지수를 가졌기 때문에 미지수 앞에 붙어있는 계수와 등호 오른쪽에 있는 상수가 해를 결정합니다. 독일 수학자 가우스는 연립방정식의 계수를 모아 ‘계수 행렬’을 만들고 상수를 모아 ‘상수 벡터’로 만든 뒤, 직접 만든 행렬 전용 소거법인 '가우스 소거법'을 이용해 해를 구했습니다. 놀라운 사실은 가우스보다 앞서 동양의 오래된 수학책인 '구장산술'에서 행렬을 이용해 해를 구하는 방법을 소개했다는 건데요. 구장산술에서는 행렬을 '방정'이라고 불렀고, 가우스와 똑같은 방법으로 연립방정식의 해를 구했습니다. 지금 '방정식'이라는 용어가 이곳에서 유래한 거지요.

가우스 소거법 쉽지만 지루한 긴 과정을 거쳐야 하지만, 그 절차를 코드로 담은 코딩 명령어를 이용하면 계수 행렬과 상수 벡터만 입력해서 쉽게 해를 구할 수 있습니다. 자, 그럼 구장산술에 수록된 미지수가 3개인 연립방정식을 소거법과 코딩, 두 가지 방법으로 풀어보도록 하죠!


 

 

구장산술 방정 문제

 

소 2마리와 양 5마리를 팔아 돼지 13마리를 사면 1000전이 남고(㉠), 소 3마리와 돼지 3마리를 팔아 양 9마리를 사면 돈이 남지 않으며(㉡) 양 6마리와 돼지 8마리를 팔아 소 5마리를 사면 600전이 모자란다(㉢). 소, 양, 돼지는 각각 얼마일까?

❶연립방정식 만들기

소, 양, 돼지의 값을 각각 x, y, z로 놓고 식을 세운다.

2x+5y-13z = 1000 … ㉠

3x-9y+3z = 0 … ㉡

-5x+6y+8z = -600 … ㉢

을 x에 대해 정리한 뒤 ㉠에 대입

x=3y-z

2(3y-z)+5y-13z = 1000

→  11y-15z = 1000

❸㉡을 x에 대해 정리한 뒤 ㉢에 대입

x=3y-z

-5(3y-z)+6y+8z=-600 

 → -9y+13z=-600

❹해 구하기

비슷한 방법으로 ❷, ❸의 식에서 y를 제거하고 해를 구한다.

∴ z=300, y=500, x=1200

    

코딩으로 연립방정식 정복하기     

연립방정식을 푸는 코딩 명령어는 다음과 같다. 코딩 수학 게시물에 있는 Sage 코딩창 또는 sage.skku.edu의 코딩창에 아래 명령어를 입력해 연립방정식의 해을 구해보자!


 

a1x + b1y + c1z = d1

⇔ 

A=matrix([[a1, b1, c1], [a2, b2, c2], [a3, b3, c3]])

a2x + b2y + c2z = d2

B=vector([d1, d2, d3])

a3x + b3y + c3z = d3

A.solve_right(B)


 

2x + 5y - 13z = 1000

3x – 9y + 3z = 0

-5x + 6y + 8z = -6

❶각 행에 있는 계수로 행렬을 만들고, 상수항은 행 1개로 이뤄진 행렬인 ‘벡터’로 지정하자. 각 수는 [와 ] 안에 순서대로 적어야 한다.

 

1

A=matrix([[2, 5, -13], [3, -9, 3], [-5, 6, 8]])

2

B=vector([1000, 0, -6])

 

 

Evaluate

sage.skku.edu



❷연립방정식을 푸는 코딩 명령어를 입력했으면 Evaluate 버튼을 클릭! 정답은 x=1200, y=500, z=300이다.  

 

1

A=matrix([[2, 5, -13], [3, -9, 3], [-5, 6, 8]])

2

B=vector([1000, 0, -6])

3

A.solve_right(B)  # 방정식의 해를 구하는 명령어

 

Evaluate

 

(1200, 500, 300)  # 답: x=1200, y=500, z=300

sage.skku.edu


 

경우의 수를 쉽게 계산하는 ‘순열과 조합’

 이번에 코딩으로 정복해 볼 수학 개념은 ‘순열과 조합’이에요.

 순열은 쉽게 말해, 순서대로 나열하는 경우의 수입니다. 예를 들어 A, B, C가 쓰인 카드 세장을 순서대로 나열한다면 { (A, B, C), (A, C, B), (B, A, C), (B, C, A), (C, A, B). (C, B, A) }이렇게 총 6가지 경우가 나옵니다.

 그런데 이렇게 순서대로 나열하는 경우를 일일이 찾아서 세지 않고 ‘팩토리얼‘로 쉽게 계산할 수 있어요. 팩토리얼(n!)은 자연수 n 부터 1까지의 모든 수를 곱하는 것입니다. 앞에서 살펴본, 서로 다른 카드 세장을 순서대로 나열하는 경우의 수는 3! = 3×2×1 = 6 입니다.

 또한, 서로 다른 n개 중 k 개를 선택하여 순서대로 나열하는 경우의 수는 = 로 쉽게 계산할 수 있습니다. 

 조합은, 순서와 상관없이 선택하는 경우의 수입니다. 예를 들어 A, B, C가 쓰인 카드 세장을 순서와 상관없이 두 장을 뽑는다면 { (A, B), (A, C) (B, C) } 이렇게 총 3가지 경우가 나옵니다. 서로 다른 n개 중 k 개를 순서와 상관없이 선택하는 경우의 수는 =  = 이며, 이를 팩토리얼로 나타내어 정리하면

  로 공식을 만들 수 있습니다.

 

    

블레즈 파스칼(1623~1662)

     경우의 수를 찾는 방법을 순열과 조합을 통해 체계적으로 제시한 사람은 17세기에 활동한 프랑스 수학자 파스칼입니다. 파스칼은 친구인 메레에게, 게임을 하다가 중단되었을 때 판돈을 어떻게 분배해야하는 지에 대하여 질문을 받았습니다. 이때 파스칼은 남아있는 게임의 수와 이기는 데 필요한 게임의 수를 이용하여, 승률에 대한 기댓값에 맞추어 판돈을 분배하는 해답을 제시하였습니다. 그리고 이 내용을 친구인 수학자 페르마에게 소개하면서 공식적으로 세상에 알려지게 되었습니다.



순열(Permutations)


정리

(1) 서로 다른 개에서 개를 순서대로 순열의 수는 이다. 특히 일 때

   이다.

(2) 개의 주어진 물건을 개의 그룹으로 분류하고자 한다. 방법의 개수는 다음과 같다.

             

여기서 번째 그룹에 있는 물건의 개수이다.


예제.  박스 안에 빨간 공 6개와 파란 공 4개가 들어 있다. 처음 빨간 공을 꺼내고, 두 번째 파란 공을 꺼내 확률은 다음과 같다.

    .

[Sage code]

print factorial(6)*factorial(4)/factorial(10)

                                                                                      

1/210



조합(Combinations)


정리

(1) 서로 다른 개에서 중복없이 개를 택하는 방법의 수는 다음과 같다.

     

(2) 서로 다른 개에서 중복을 허락하여 개를 택하는 방법의 수는 다음과 같다.

    


예제.  500개의 전구로부터 5개의 백열전구를 택하는 방법의 개수는 이다.

 

[Sage code]

print binomial(500, 5)

                                                                                     

255244687600


http://www.polymath.co.kr/mini/1330

 

                                 

 

 

                                           

Part Ⅰ. 행렬과 데이터분석


[명령어 모음] http://matrix.skku.ac.kr/Lab-Book/Sage-Lab-Manual-2.htm

[연 습 문 제]   http://matrix.skku.ac.kr/LA-Lab/

[디지털교과서]  http://matrix.skku.ac.kr/LA-K/


 

0. Big Picture

1. 벡터

2. 선형연립방정식

3. 행렬과 행렬식

4. 일차독립과 기저 및 차원

5. 선형변환

6. 고유값, 고유벡터, 대각화

7. SVD (특이값 분해)

8. 이차형식(quadratic form)



0. Big Picture (기초 선형대수학 개념의 구성)


벡터 : 예를 들어 힘, 속도, 가속도 등 방향과 크기를 모두 포함하는 물리량을 벡터(vector)라 하고, 일반적으로 개 실수의 순서조  (순서쌍) 차원 공간의 벡터를 나타낸다.

벡터 노름(norm, length, magnitude),


벡터 , 내적(Euclidean inner product, dot product)

                 = =


 벡터공간 : 임의의 집합 에 두 연산, 덧셈(vector addition, )과 스칼라 배(scalar multiplication, )가 정의되고, 2개의 기본성질 (두 연산에 대하여 닫혀있다-closed )과 8개의 연산성질을 만족하면 가 벡터공간(vector space))을 이룬다고 한다. 예, , , , 행렬공간 등


 부분공간 : 의 부분공간(subspace)이라는 것은 벡터공간의 부분집합이면서 동시에 그 자체로 벡터공간이 되는 경우를 말한다.


 2 step 부분공간 test : 의 부분공간이 되는지 확인하려면 다음의 두 가지를 보이면 된다.

        (1)    (2)


 일차결합 : 의 한 일차결합(linear combination)이란 적당한 스칼라 가 존재하여 다음을 만족하는 경우를 말한다.;

               


 Span(일차결합들의 전체집합) : 의 일차결합 전체를 모은 집합을 에 의하여 생성된(spanned) 부분공간이라 하고 다음과 같이 표기한다.

             의 span


 일차독립 : 에 대하여

            

을 만족하면 는 일차독립(linearly independent)이라 한다.


 일차종속 : 가 일차독립이 아니면 일차종속(linearly dependent)이라 한다. 가 일차종속이면 모두는 영은 아닌 스칼라 (즉, 중 적어도 하나는 영이 아닌) 가 존재하여 다음을 만족한다.

            


 벡터공간의 기저 : 다음을 만족하는 의 기저(basis)라 한다.

            (1) 가 일차독립이다.  (2)


 벡터공간의 차원 : 의 기저라 할 때 의 차원(dimension)은 다음과 같이 정의된다.

                    


 행공간 : 행렬 의 행벡터들의 일차결합 전체의 집합을 행공간(row space)이라 한다. 즉,

            Row()


 열공간 : 행렬 의 열벡터들의 일차결합 전체의 집합을 열공간(column space)이라 한다. 즉,      Col()


 계수 : 행공간(열공간)의 차원을 행렬의 계수(rank)라 한다. 즉

            rank() Row() Col().


 벡터공간의 기저는 다음을 만족한다.     (토론)

    (1) 기저는 maximal linearly independent subset 이다.

    (2) 기저는  minimal spanning subset 이다.


 초평면(hyperplane) : 에 대하여

                          

초평면(hyperplane)이라 한다.


 정사영 : 에서 벡터를 상의 정사영(또는 직교사영, orthogonal projection)이라 하고, 상의 직교성분(orthogonal component)이라 한다.


 행렬의 고윳값과 고유벡터 : 차의 정사각행렬일 때, 을 만족하는 스칼라 의 고유값(eigenvalue)이라 하고, 을 만족하는 아닌 벡터 를 고유값 에 대응하는 의 고유벡터(eigenvector)라고 한다.


 행렬의 대각화 : 가 어떤 대각선행렬과 닮음행렬일 때, 즉 적당한 가역행렬 가 존재하여 가 대각선행렬일 때 를 대각화가능한(diagonalizable) 행렬이라 하며, 이때 행렬 를 대각화하는(diagonalizing) 행렬이라고 한다.


 SVD(특이값분해), 일반화된 역행렬, 최소제곱해, 선형회귀 : 행렬 로 분해될 수 있다는 이론을 행렬의 특이값분해(SVD, singular value decomposition) 또는 간단히 행렬 의 SVD라 부른다.


 차원축소(dimension reduction)와 변수추출(feature extraction) : 어떤 목적에 따라서 데이터(행렬)의 크기(차원)를 줄이는 다양한 방법


 주축정리(主軸定理, 영어: principal axis theorem)는 이차 형식을 기술하는 문제에서, 어떤 이차 형식이든 적절한 변수 변환을 통해 혼합항이 없는 행렬 형태로 표현할 수 있음을 보장하는 정리


 고유값 분해(eigen decomposition)는 고유값 과 고유벡터을 이용하여 주어진 행렬을 고유값 행렬과 고유벡터 행렬의 곱으로 분해하는 표현


 PCA (주성분분석, Principal Component Analysis), PCA는 데이터의 분산(variance)을 최대한 보존하면서 서로 직교하는 새 기저(축)를 찾아, 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환하는 기법


 서포트 벡터 머신(support vector machine, SVM) : https://www.youtube.com/watch?v=eHsErlPJWUU&hd=1

데이터를 분류하는 것은 기계학습에 있어서 일반적인 작업이다. 주어진 데이터 점들이 두 개의 클래스 안에 각각 속해 있다고 가정했을 때, 새로운 데이터 점이 두 클래스 중 어느 곳에 속하는지 결정하는 것이 목표이다. 서포트 벡터 머신에서, 데이터 점이 p-차원의 벡터 (p개의 숫자 리스트)로 주어졌을 때, 이러한 데이터 점을 (p-1)-차원의 초평면으로 분류할 수 있는지를 확인하고 싶은 것이다.


        

        



 “선형대수학과 구글(Google) 검색엔진”

 

- 페이지랭크 알고리즘

 

https://www.scienceall.com/미래를-여는-수학-⑦-Google-검색의-비밀은/ 


...

... Part I.   행렬과 빅데이터

 

...

아래는 Sage가 제공하는 gram_schmidt() 함수를 수정하여 좀 더 직관적으로 그 과정을 확인하도록, gs_orth() 함수 코드를 만들어 QR 분해를 확인하였다. (자주 사용하는 함수는 함수 코드를 만들어 활용한다.)

# SageMathgram_schmidt() 함수를 보완하여 gs_orth()만들었음

def gs_orth(A): # 함수 정의

m, n = A.nrows(), A.ncols() # 행렬의 크기

r = A.rank() # 행렬의 rank

if m < n: # 행렬의 크기 확인

raise ValueError("The number of rows must be larger than the number of columns.")

elif r < n: # full column rank인지 확인

raise ValueError("The matrix is not full column rank.")

[G, mu] = A.transpose().gram_schmidt() # gram_schmidt 함수 활용

Q1 = matrix([G.row(i) / G.row(i).norm() for i in range(0, n)]) # Qtranspose

R1 = Q1*A

Q = simplify(Q1.transpose()) # 정규직교기저로 만들어진 행렬

R = simplify(R1) # 상삼각행렬

return Q, R

 

A = matrix([[1, 0, 0], [1, 1, 0], [1, 1, 1]]) # 행렬 입력

Q, R = gs_orth(A) # QR 분해

print "Q ="

print Q

print

print "R ="

print R

print

print "Q*R ="

print Q*R

Q =

[ 1/3*sqrt(3) -1/3*sqrt(2)*sqrt(3) 0]

[ 1/3*sqrt(3) 1/6*sqrt(2)*sqrt(3) -1/2*sqrt(2)]

[ 1/3*sqrt(3) 1/6*sqrt(2)*sqrt(3) 1/2*sqrt(2)]

 

R =

[ sqrt(3) 2/3*sqrt(3) 1/3*sqrt(3)]

[ 0 1/3*sqrt(2)*sqrt(3) 1/6*sqrt(2)*sqrt(3)]

[ 0 0 1/2*sqrt(2)]

 

Q*R = A =

[1 0 0]

[1 1 0]

[1 1 1] # (QR 분해 임을 확인)

...

예제 1. 행렬 특이값분해(SVD)를 구하여라.

A = matrix([[sqrt(3), 2], [0, sqrt(3)]])

B = A.transpose()*A

eig = B.eigenvalues()

sv = [sqrt(i) for i in eig] # 특이값 구하기

print B.eigenvectors_right() #   고유벡터 구하기, right singular vector

[(9, [(1, sqrt(3))], 1), (1, [(1, -1/3*sqrt(3))], 1)]

G = matrix([[1, sqrt(3)], [1, -1/3*sqrt(3)]])

Vh = matrix([1/G.row(j).norm()*G.row(j) for j in range(0,2)]) # V의 전치행렬

Vh = Vh.simplify() # V의 전치행렬 표현

print Vh

print

U = matrix([A*Vh.row(j)/sv[j] for j in range(0,2)]).transpose() # U

print U #    left singular vector

print

S = diagonal_matrix(sv)

print S

print

print U*S*Vh

[ 1/2 1/2*sqrt(3)]

[1/2*sqrt(3) -1/2]

 

[ 1/2*sqrt(3) 1/2]

[ 1/2 1/2*sqrt(3)]

 

[3 0]

[0 1]

 

[sqrt(3) 2]

[ 0 sqrt(3)] [ 실습 : http://sage.skku.edu/ 또는 https://sagecell.sagemath.org/ ]

...

* 선형모델(최소제곱직선)

    ...

Sage 코드를 이용하여 확인하면 http://sage.skku.edu/

x1 = vector([1 for i in range(105)]) # 첫 번째 열 생성

x2 = vector([3.45, 2.78, 2.52, 3.67, 3.24, 2.1, 2.82, 2.36, 2.42, 3.51, 3.48, 2.14,

2.59, 3.46, 3.51, 3.68, 3.91, 3.72, 2.15, 2.48, 3.09, 2.71, 2.46, 3.32,

3.61, 3.82, 2.64, 2.19, 3.34, 3.48, 3.56, 3.81, 3.92, 4, 2.52, 2.71,

3.15, 3.22, 2.29, 2.03, 3.14, 3.52, 2.91, 2.83, 2.65, 2.41, 2.54, 2.66,

3.21, 3.34, 3.68, 2.84, 2.74, 2.71, 2.24, 2.48, 3.14, 2.83, 3.44, 2.89,

2.67, 3.24, 3.29, 3.87, 3.94, 3.42, 3.52, 2.24, 3.29, 3.41, 3.56, 3.61,

3.28, 3.21, 3.48, 3.62, 2.92, 2.81, 3.11, 3.28, 2.7, 2.62, 3.72, 3.42,

3.51, 3.28, 3.42, 3.9, 3.12, 2.83, 2.09, 3.17, 3.28, 3.02, 3.42, 3.06,

2.76, 3.19, 2.23, 2.48, 3.76, 3.49, 3.07, 2.19, 3.46]) # 두 번째 열 생성

A = column_matrix([x1, x2]) # 계수행렬

b = vector([3.52, 2.91, 2.4, 3.47, 3.47, 2.37, 2.4, 2.24, 3.02, 3.32, 3.59, 2.54,

3.19, 3.71, 3.58, 3.4, 3.73, 3.49, 2.25, 2.37, 3.29, 3.19, 3.28, 3.37,

3.61, 3.81, 2.4, 2.21, 3.58, 3.51, 3.62, 3.6, 3.65, 3.76, 2.27, 2.35,

3.17, 3.47, 3, 2.74, 3.37, 3.54, 3.28, 3.39, 3.28, 3.19, 2.52, 3.08,

3.01, 3.42, 3.6, 2.4, 2.83, 2.38, 3.21, 2.24, 3.4, 3.07, 3.52, 3.47,

3.08, 3.38, 3.41, 3.64, 3.71, 3.01, 3.37, 2.34, 3.29, 3.4, 3.38, 3.28,

3.31, 3.42, 3.39, 3.51, 3.17, 3.2, 3.41, 3.29, 3.17, 3.12, 3.71, 3.5,

3.34, 3.48, 3.44, 3.59, 3.28, 3, 3.42, 3.41, 3.49, 3.28, 3.17, 3.24,

2.34, 3.28, 2.29, 2.08, 3.64, 3.42, 3.25, 2.76, 3.41]) # 상수항 벡터

c, d = n((A.transpose()*A).inverse()*A.transpose()*b, digits = 5) # 최소제곱해

print c, d

p1 = point([(x2[i], b[i]) for i in range(105)]) # 데이터를 좌표평면에 그리기

p2 = plot(c + d*x, (x, 2, 4), color = 'red') # 최소제곱직선 그리기

p1 + p2

1.0968 0.67483 # y = c + dx, c=1.0968 d=0.67483

 

 

  데이터와 선형모델(최소제곱직선) 을 그리면 ...

 

http://matrix.skku.ac.kr/sglee/project/generalized-inverse/ (일반화된 역행렬의 성질들!)

http://matrix.skku.ac.kr/2018-album/LS-QR-decom.html (최소제곱해)

...

Part . 다변수 미적분학과 최적화

http://matrix.skku.ac.kr/math4ai/part2/

 

...

예제 13. 다음 이중 적분을 계산하라. [실습: https://sagecell.sagemath.org/ ]

 

var('x, y, z')

f(x, y) = 2 - y^2

p1 = implicit_plot3d(y == 1 - x, (x, -2, 1), (y, 0, 3), (z, -7, 2), color = 'yellow', opacity = 0.4)

p2 = implicit_plot3d(z == 0, (x, -2, 1), (y, 0, 3), (z, -7, 2), color = 'green', opacity = 0.4)

p3 = plot3d(f(x, y), (x, -2, 1), (y, 0, 3), opacity = 0.4)

p1 + p2 + p3

var('x, y') # 이중 적분의 변수 정의

f(x, y) = 2 - y^2 # 주어진 함수

show(plot(1 - x, (x, -2, 1), fill = True)) # 적분영역 (함수)

print integral(integral(f, y, 0, 1 - x), x, -2, 1) # 이중 적분 계산

 

9/4 # 이중적분...  .

...

var('x, y') # https://sagecell.sagemath.org/

p1 = implicit_plot(x - 2*y == 0, (x, -1, 3), (y, -2, 2))

p2 = implicit_plot(x - 2*y == 2, (x, -1, 3), (y, -2, 2), color = 'red')

p3 = implicit_plot(2*x + 3*y == 0, (x, -1, 3), (y, -2, 2), color = 'green')

p4 = implicit_plot(2*x + 3*y == 3, (x, -1, 3), (y, -2, 2), color = 'black')

show(p1 + p2 + p3 + p4)

var('u, v')

print solve([u == x - 2*y, v == 2*x + 3*y], x, y) # x == 3/7*u + 2/7*v, y == -2/7*u + 1/7*v

T = (3/7*u + 2/7*v, -2/7*u + 1/7*v)

J = jacobian(T, (u, v)).det()

print "Jacobian =", J

f(x, y) = 7*x*y

integral(integral(f(T[0], T[1])*abs(J), u, 0, 2), v, 0, 3)

 

답: [[x == 3/7*u + 2/7*v, y == -2/7*u + 1/7*v]]    Jacobian = 1/7,     . -3/7
...

[Sage code] http://mathlab.knou.ac.kr:8080/ http://sage.skku.edu/

var('x, y')

f(x, y) = 1/9*exp(-(x + y)/3)

print integral(integral(f(x, y), y, 0, 1/2 - x), x, 0, 1/2)

print (integral(integral(f(x, y), y, 0, 1/2 - x), x, 0, 1/2)).n(digits=5)

-7/6*e^(-1/6) + 1

. 0.012439

...

Part . 확률통계와 빅데이터

http://matrix.skku.ac.kr/math4ai/part3/

인공지능을 위한 기초수학 18(통계 1: 통계학과 R), Basic Math for AI 18 https://youtu.be/u82BC1RiJ0A

...

확률과 통계에서 중심극한정리(Central Limit Theorem)가 의미하는 것은 (대부분의 경우) 모집단의 분포가 연속형이든, 이산형이든, 또는 한쪽으로 치우친 형태이든 간에 표본의 크기가 클수록 표본평균의 분포가 점점 정규분포에 가까워진다는 의미이다. 아래 R 코드를 통하여 확인할 수 있다.

 

[R code] http://mathlab.knou.ac.kr:8080/ http://mathlab.knou.ac.kr/r/ http://sage.skku.edu/

CLT.plot <- function(r.dist, n, ...) {

means <- double()

# 사이즈 n의 샘플을 500회 생성하여 표본평균을 계산

for(i in 1:1000) means[i] = mean(r.dist(n,...))

# 표본평균을 표준화

std.means <- scale(means)

# 플롯의 파라메터 설정(2개의 플롯을 한 화면에)

par(mfrow = c(1, 2))

# 히스토그램과 표본의 밀도

hist(std.means, prob = T, col = "light grey", border = "grey", main = NULL, ylim = c(0, 0.5))

lines(density(std.means))

box()

# 표준정규분포 곡선

curve(dnorm(x, 0, 1), -3, 3, col = 'blue', add = T)

# Q-Q plot

qqnorm(std.means, main="", cex = 0.8)

abline(0, 1, lty = 2, col = "red")

par(mfrow = c(1, 1))

}

 

# 카이제곱분포

CLT.plot(rchisq, n = 10, df = 1)

CLT.plot(rchisq, n = 30, df = 1)

CLT.plot(rchisq, n = 50, df = 1)

# 이항분포

CLT.plot(rbinom, n = 10, size = 10, p = .5)

CLT.plot(rbinom, n = 30, size = 10, p = .5)

CLT.plot(rbinom, n = 50, size = 10, p = .5)

dev.off()

...

여기서 표본의 크기  n 이 커질수록 표본평균의 분포가 파란색 실선인 정규 분포에 점점 가까워져 감을 알 수 있다. 그리고 오른쪽에 있는 Q-Q(이론상의 Quantile vs. 획득한 샘플값의 Quantile) 플롯은 분석할 표본 데이터의 분포와 정규분포의 분포 형태를 비교하여 표본 데이터가 정규분포를 따르는지 (, red line과 중간 부분에서 오차가 없는지) 검사하는 간단한 시각적 도구가 된다.

 

중심극한정리가 잘 작동하는지 R을 활용하여 살펴보자.

...

예제 20. 균등분포   U( 0, 1) 에서 크기가  n=1, 4, 16, 64, 256 인 임의표본의 평균을 각  n 에 대하여 1000번씩 계산하여 히스토그램과 QQ-plot을 작성하라. (아래 R 코드 참조) 표본평균이 정규분포에 근접하려면 n 은 얼마나 커야 하는가? 마찬가지로 표본의 분산을 구해보고, n 이 커질 때 이 값은 어떻게 변화하는지 토의하라.

 

[R code] http://mathlab.knou.ac.kr:8080/ http://mathlab.knou.ac.kr/r/ http://sage.skku.edu/

set.seed(222)

ITER <- 1000

N <- c(1, 4, 16, 64, 256) # 샘플의 크기

variances = rep(NA, length(N)) # 평균들의 분산을 저장

par(mfrow = c(1,2)) # 하나의 창에 2개 그림 동시에 그리기

for(i in 1:length(N)){

# Unif(0, 1)에서 1000 x N[i] 행렬을 얻기

unif.mat <- matrix(runif(ITER*N[i], 0, 1), nrow = ITER, ncol = N[i], byrow = T)

# 각 행의 평균

sample.means <- apply(unif.mat, MARGIN = 1, FUN = mean)

# 표본 평균의 분산

variances[i] <- var(sample.means)

# 히스토그램 만들기

hist(sample.means, main = eval(paste("표본 평균, n = ", N[i])),

xlab = expression(bar(X)), xlim=c(0, 1), probability = T)

# q-q plot 그리기

qqnorm(sample.means, ylim=c(0, 1)); qqline(sample.means, col = "red")

}

 

variances

1/(12*N)

dev.off()

[1] 0.0808451462 0.0211910408 0.0054114866 0.0013017499 0.0003425692

[1] 0.0833333333 0.0208333333 0.0052083333 0.0013020833 0.0003255208

...

 

 Part . 빅데이터와 인공지능

(인공지능 알고리즘에 응용하는 수학, 선형회귀, 자연어 처리, 이미지 인식)

http://matrix.skku.ac.kr/math4ai/part4/

인공지능을 위한 기초수학 24(빅데이터와 인공지능 1), Basic Math for AI 24

 

 

20191028, 정부는 인공지능(AI)에 대한 기본구상을 바탕으로 인공지능 국가전략을 제시하고, 이어서 정부 스스로가 가장 적극적으로 인공지능을 활용 · 지원하겠다고 밝혔다. 인공지능(Artificial Intelligence, AI)이란 사람들이 일반적으로 하는 것, 특히 지능적으로 행동하는 사람들이 하는 일을 대신 할 수 있는 컴퓨터의 개발을 목표로 하는 컴퓨터 과학의 하위 분야이다. 1956년 여름에 있었던 "다트머스 AI 컨퍼런스"에서 인용된 정의에서 출발하면, 사람들이 지능적인 행동이라고 생각할 만한 일들을 대신해 주는 어떤 소프트웨어(프로그램)라도 우리는 그것을 AI 시스템으로 볼 수 있다. 60년 전에 논의된 AI가 요즘 다시 부각되는 이유는, 60년 전에 생각했던 것보다 그런 발전을 실제로 이루어 내는 것이 쉽지 않았기 때문이다.

 

Amazon이 당신에게 책을 추천해줄 때, 그 추천 뒤에 숨은 AI 시스템을 이해하는 사람은 많지 않다. 이런 시스템을 이해하기 위한 비결은 지능을 기반으로 하는 프로세스 자체는 블랙박스가 아니라는 것을 이해하는 것이다. 지능형 시스템은 생각보다 간단하며, 우리가 완전히 이해할 수 있는 이론과 절차에 따라 만들어진 것으로, AI는 마술이 아니라 데이터, 규모 및 처리 능력에 의해 구동되는 알고리즘 모음을 적용하는 것이다. 앞서 언급한 Amazon은 당신의 구매 패턴에 대한 정보를 모으고, 당신이 누구인지 그리고 당신이 다른 사람들과 얼마나 비슷한지를 찾아낸다. 그리고 당신과 비슷한 사람들이 좋아하는 것을 바탕으로, 당신에게 새로운 상품을 추천해준다. 즉 우리를 포함한 모든 지능형 시스템의 경우, 현재 진행 중인 상황을 이해하고 이로 부터 추론하여, 다음에 어떤 일이 일어날 지 예측한다.

 

이런 예측 분석(predictive analytics) 작업은 다양한 기술을 사용한다. 보다 공식적인 측면에서 시스템은 소스(표시되는 기능)와 대상(관심 있는 기능)을 연결하는 수학적 모델을 만드는 것을 목표로 하는 회귀 분석(regression analysis)과 같은 통계 기법을 사용한다. 구매자의 활동이 시간별로 추적되는 상황에서는 시계열 분석(time series analysis)을 통해 시스템은 주어진 과거의 행태(behavior)를 이용하여 구매활동의 미래 경로를 추측 할 수 있다. 또한 개별 기능과 예측 능력을 결합하여 딥러닝에 사용되는 신경망과 유사하면서 단순한 신경망(neural nets)을 생성하는 Naïve Bayes와 같은 기계학습 이론을 사용하는 경우가 많다.

 

 

Part 에서는 먼저 인공지능(Artificial Intelligence), 기계학습(Machine Learning, 머신러닝), 딥러닝(Deep Learning) 등의 개념과 인공지능의 역사에 대하여 간단히 알아보고, 앞서 배운 수학적 지식이 인공지능에서 어떻게 사용되는지 살펴본다. 구체적으로는 데이터 분석에서 자주 사용되는 주성분 분석(principal component analysis), 신경망(neural network), 그리고 데이터 마이닝 학생프로젝트 사례를 소개한다.

 

인공지능, 기계학습, 딥러닝 등의 용어는 최근 뉴스와 광고 등에서 많이 사용되고 있음에도 그 명확한 구분은 쉽지 않다. Carnegie Mellon대 전산학부 앤드류 무어(Andrew Moore)인공지능은 최근까지 우리가 필요하다고 생각한 방식으로 컴퓨터가 행동하도록 만드는 과학 및 공학이라고 정의하였으나, 여전히 그 경계는 모호하다.

 

기계 학습은 컴퓨터 과학자이자 기계 학습의 선구자 Tom M. Mitchell​​정의한 바와 같이 컴퓨터 프로그램이 경험을 통해 자동으로 개선 될 수 있도록 하는 컴퓨터 알고리즘에 대한 연구 이다. 즉 기계학습은 인공지능과 동의어라기보다는 인공지능을 달성하기 위하여 주어진 데이터를 조사하고 비교하여 공통 패턴을 찾고, 뉘앙스를 탐색하여 특정한 과제를 수행하도록 돕는 한 방법론이라고 할 수 있다.

 

기계 학습 유형 은 크게 지도 학습(Supervised Learning), 비지도 학습(Unsupervised Learning), 강화 학습(Reinforcement Learning)이 있다. 지도학습은 데이터에 대한 레이블(Label)이 주어진 상태에서 컴퓨터를 학습시키는 방법으로 앞으로 2절에서 살펴볼 “MNIST 데이터셋을 활용한 손 글씨 숫자 인식이 대표적인 예라고 할 수 있다. 그리고 비지도 학습은 데이터에 대한 레이블이 주어지지 않은 상태에서 컴퓨터를 학습시키는 방법으로 데이터의 숨겨진 특징이나 구조를 발견하는데 사용된다. 1절에서 살펴볼 주성분 분석(PCA)이 데이터의 차원을 줄이는 비지도 학습의 대표적인 예이다. 마지막으로 강화 학습은 환경과의 상호 작용에서 수집 한 관측치를 사용하여 보상을 극대화하거나 위험을 최소화하는 조치를 취하는 것을 목표로 하는 것으로, 어떤 환경 안에서 정의된 에이전트가 현재의 상태를 인식하여, 선택 가능한 행동들 중 보상을 최대화하는 행동 혹은 행동 순서를 선택하는 방법이다.

 

인공지능이라는 말은 1965년에 처음 등장하였으나, 최근에 와서 데이터가 양적으로 증가하고, 최신의 알고리즘과, 컴퓨팅 파워로 인하여 매우 활발히 연구되고 있다. 인공지능컴퓨터가 마치 인간의 뇌와 같이 작동하여 이미지를 인식하거나 자율주행과 같은 업무를 수행하도록 한다는 개념이다. 기계학습(머신러닝)은 인공지능의 일부일 뿐이다.

 

신경망(neural network)은 기계학습의 모델 중의 하나로, 신경계의 기본 단위인 뉴런(신경세포, neuron)을 모델화 한 것이다. 인공 뉴런(ANN)1943년에 Warren McCullochWalter Pitts가 처음 소개하였고, 1950년대 초반에는 문제 해결과 기호법 등의 주제를 탐구했다. 1950년대 후반에 이르러 Frank Rosenblatt과 여러 연구자들이 퍼셉트론(perceptron)이라 불리는 신경망을 고안하였다. 퍼셉트론의 경우, 문제를 해결하는 가중치(weight)가 있는 경우에 학습 규칙이 정확한 네트워크의 가중치로 수렴한다는 것을 입증했지만, 많은 한계를 가지고 있어서, 오랫동안 신경망 연구가 중단되었다. 1960년대로 접어들면서 이러한 연구에 관심을 보인 미 국방부는 인간의 기본적인 추론 방식을 흉내 낼 수 있도록 컴퓨터를 훈련하기 시작하였고, 1970년 국방 고등 연구 기획국(DARPA)이 수행한 도로 지도화 프로젝트가 그 사례라고 할 수 있다. 1980년대에 이르러 다중 신경망(multilayer networks)을 학습하는 오차 역전파법(backpropagation algorithm)이 개발되면서 신경망 연구가 다시 활력을 얻게 되었다. 또한 국방 고등 연구 기획국은 Siri, AlexaCortana와 같은 인공지능이 개발되기 한참 전인 2003년에 지능형 개인 비서를 개발하기도 하였다.

 

딥러닝 (deep learning)은 음성을 인식하고, 이미지나 패턴을 확인하고, 다음 상황을 예측하는 일과 같이 인간이 하는 작업을 수행하도록 컴퓨터를 교육하는 일종의 기계 학습(머신 러닝)이다. 사전에 정의 된 수식을 통해 실행되도록 데이터를 구성하는 대신, 1. 주어진 데이터에 basic parameterset up해주고, 2. 여러 겹의 처리 계층을 사용하여 패턴을 인식하면서, 컴퓨터가 스스로 학습하도록 train하는 것이다. 이러한 노력들은 오늘날 우리가 일상에서 접하고 있는 자동화와 형식 추론 기술의 기틀을 다지는 역할을 하였으며, 이러한 기술에는 사람의 능력을 보완하고 확장할 수 있는 의사 결정 지원 시스템과 스마트 검색 시스템이 포함된다. AmazonNetflix가 머신러닝을 이용한 추천 시스템의 개념을 대중화한 것과 같이, 앞으로 산업 전반적인 분야에서 인공지능(AI)이 활용될 것으로 사료된다.

 

 

3. 학생 프로젝트 사례


아래는 2016년도 1학기 성균관대학교에서 개설된 ‘빅데이터를 위한 수학’ 강의(담당: 이상구 교수)에서 수행된 학생 프로젝트 사례이다.


       제목 :  Statistical analysis on features of actual energy consumption

                       of office buildings in the South Korea

                                                                    지도 : 이상구 교수

                           프로젝트 수행 학생 :  안기언, 추한경

                                                  


3.0 역할 분담


○ 안기언

- 데이터마이닝 분석을 수행하기 위한 데이터의 가공

- 자료의 시각화 및 분석

- 통계기반 데이터마이닝

- 보고서 작성


○ 추한경

- 건물정보 데이터베이스 수집

- 데이터 필터링


[발표 동영상]  웹사이트 주소  (Midterm PBL 이외에 없는 것 같습니다.)


3.1 Outline of project


○ 목적 : 국내 건축물 에너지 소비 현황 및 특징을 분석하고, 에너지 사용량에 영향을 미치는 요소를 확인하여, 향후 정책 및 에너지 절감 기술 개발 방향 논의


○ 배경 : 전 세계적으로, 건축물에서 소비되는 에너지를 절감하기 위해, 에너지 절감 정책을 제정하고, 신기술 개발에 주력하고 있음. 하지만, engineering based approach(e.g. building energy simulation analysis) 기반의 건물 에너지 성능 분석 및 예측은 건축물의 실제 에너지 소비와 상당한 차이를 보임. 따라서, 전술한 노력들이 실효성을 지니기 위해서는, 기존 건축물의 현황 및 에너지 소비 패턴에 대한 분석이 선행되어야함.


○ 비고 : 본 수업시간을 통해 접하게 된 R을 실제 데이터 마이닝 프로젝트에 활용하면서, R을 학습하고 익히기 위한 개인적인 목표가 있었음. 따라서 본 프로젝트는 데이터의 편집을 제외하고 모든 과정을 R을 통해서 진행함



3.2 Data collection and matching


○ 개념 : 데이터마이닝을 통해 자신이 원하는 정보를 획득하기 위해서는, 원본 데이터를 자신의 목적 및 데이터마이닝 방법에 맞춰 변형시키는 작업이 필요함 (Data generalization or specialization).


○ 개요 : 최근 정부는 건축물 특징에 대한 정보가 담긴 데이터베이스와 건축물에서 소비되고 있는 에너지 사용량 데이터베이스를 각각 공개하였으며, 본 프로젝트는 두 데이터베이스를 수집하고, 각 데이터베이스가 포함하고 있는 건축물 주소를 기준으로 하나의 데이터베이스로 통합하는 작업을 수행함.


 ○ 데이터베이스 목록: 정부 3.0에 따라 공개된 건축물 데이터베이스 2가지 활용

   - 건물 특징 정보 데이터베이스: http://open.greentogether.go.kr

     • 데이터 목록: 주소, 연면적, 용적율, 주용도, 기타용도, 세대 수, 층 수, 준공년도

   - 건물 에너지 사용량 데이터베이스: https://open.eais.go.kr

     • 데이터 목록: 주소, 전기/가스 월별 에너지 사용량



3.3 Description of database(DB)


○ 대상 : 서울시 업무용 건축물, 총 4,603동

○ 데이터 목록

  - 주소 : 구(서울시 소재 25개 구), 동, 지번 [문자 형태]

  - 층수 : 지상 층수, 지하 층수 [숫자 형태]

  - 연면적 [숫자형태]

  - 엘리베이터 대수 [숫자 형태] 

  - 용도 : 주용도, 부용도 [문자형태]

  - 준공년도 [숫자형태]

  - 에너지 사용량: 월별 전기, 가스 에너지 사용량 [숫자 형태]


○ DB의 건축물 위치 가시화

  - 방법: 데이터 목록이 포함하고 있는 주소를 기준으로, 위도 및 경도 정보를 획득하고, 이를 통해 지도에 위치를 표현함

          

3.4 Visualization of energy consumption

...


3.8 Detailed analysis on correlation between energy consumption and building features


○ 목적 : 에너지 사용량을 절약하기 위해서는, 에너지 사용량과 밀접한 요인을 확인해야 하므로, DB가 포함하고 있는 건물 특징 정보와 에너지 사용량 사이의 상관관계를 분석하기 위함

○ 방법 : 직관적인 해석을 위해 scatter plot을 활용하며, 정량적인 확인을 위해 correlation matrix를 이용함.

○ 결과 : DB가 포함하고 있는 건물 특정 정보(연면적, 층수, 준공년도, 지역 구)는 에너지 사용량과의 상관관계를 설명하기 어려움

                         <건축물 특징 사이의 scatter plot matrix 분석 결과>

                              <건축물 특징 사이의 correlation plot>


                              <건축물 특징 별 에너지 사용량 확률 밀도>


3.9 Estimation of energy basis and building operation hour


○ 목적 : 건축물의 에너지 사용량에 절대적인 영향력을 미치는 건물 운영시간을 추정하기 위하여, 건물 운영시간을 예측하기 위한 건물 기저 에너지 사용시간을 추정

○ 가정 : 기저에너지 사용량 (kWh/m2)=(조명발열 + 기기발열 + 엘리베이터 x 대수 kW/m2) x 시간(h)

○ 방법 : 각 건물의 월별 단위면적당 전기 에너지 사용량 중 가장 적은 값을 기저 에너지 사용량으로 가정함

○ 결과 : 건물 에너지 사용량과 건물 운영시간은 밀접한 관계를 지님


 

                        <건물 운영시간과 전기 에너지 사용량의 scatter plot>


                           <건물 운영시간과 일차 에너지 사용량의 scatter plot>


             

                            <건물 운영시간의 확률밀도 및 누적확률밀도>

             

                                       <건물 운영시간의 qq plot>

3.10 Conclusion


○ 노후화된 건축물의 에너지 성능 개선을 통해, 에너지 사용량을 절감할 수 있다는 직접적인 근거를 확인하기 어려움(노후 건축물의 에너지 사용량이 적기도 하며, 신식 건축물의 에너지 사용량이 많기도 함)

○ 건물의 에너지 사용량에 결정적 영향을 미치는 요인은 건물의 특징 및 속성보다도 건물의 에너지 사용시간이며, 이로 인해 건축물의 에너지 성능과 사용량 사이의 차이가 발생함(performance gap)

○ 건물의 성능이 에너지 사용량에 영향을 미칠 수 있지만, 건물 설비 시스템의 효율적인 운영이 에너지 사용량을 절감시킬 수 있는 결정적인 요인이 될 것으로 추정됨


[참고 문헌]

건물에너지 정보공개시스템, http://open.greentogether.go.kr (accessed by 2016.06.13.)

건축데이터 민간개방 시스템, https://open.eais.go.kr (accessed by 2016.06.13.)



3.11 Final comments


○ 안기언

  - 3월 기계학습 관련 수학적 배경지식의 학습과정에서는 어려움이 있었고, 처음 경험해보는 PBL 수업이기에, 학기 초에는 본 수업의 프로세스가 다소 낯설고 적응하기 힘들기도 했습니다. 하지만, 다른 학생들이 수업에 임하는 태도와 성의, 교수님의 적극적인 수업 환경조성이 본 수업 방식에 익숙해지는데 많은 도움이 되었습니다.

  - 본 수업을 통해, 한 학기동안 기계학습 관련 수학적 배경지식을 습득하고, 관련 예제를 직접 다뤘으며, 주제를 선정하여 프로젝트를 진행하였습니다. 수업을 수강하기 전과 후의 차이라면, 기계학습 관련 문헌을 읽더라도 수학적 알고리즘 설명에 거부감이 확연히 줄어들었으며, 수업시간에 학습한 개념들이 이론을 이해하는데 많은 도움이 되고 있습니다. 더불어, 프로젝트의 성과는 논문으로 발전시킬 계획입니다. 특히, 프로젝트에서 R 프로그램을 이용하였으며, 본 수업을 통해 R 프로그램을 학습하는 계기를 마련해주셔서 너무나 감사하게 생각하고 있습니다.

  - 마지막으로, 본 기계학습 PBL 수업은 지식의 습득 및 활용에 최적화된 수업이라고 생각합니다. 이와 같은 환경을 조성해주신 교수님과 수업에 적극적으로 참여하여 많은 도움을 준 학생들에게 감사의 인사를 전합니다.


○ 추한경

  - 이번 수업을 통해 건물 에너지 및 빅 데이터에 대한 새로운 사실을 많이 알 수 있었습니다. 데이터 수집 및 데이터 필터링을 맡으면서 raw 데이터에 중복 및 손실상태가 많음을 확인할 수 있었고, 이를 해결하면서 빅 데이터를 유용하게 사용하기 위해선 raw 데이터를 그대로 사용하기보다 연구목적에 맞도록 가공하는 과정이 필요함을 알 수 있었습니다.

  - 프로젝트 연구결과는 많이 흥미로웠습니다. 저는 현재 노후화된 기존건축물들의 리모델링 전/후 에너지 사용량을 정량적으로 측정하는 방법에 대하여 연구 중 입니다. 본 프로젝트를 진행하면서, 빅 데이터를 다루는 것이 연구배경에 대한 통찰을 확장시켜 줄 수 있음을 알 수 있었습니다.

- 또한 수업 중 동료 및 교수님이 QnA에 업데이트한 자료를 통해 빅 데이터를 다루는 방법에 대하여 많은 학습을 할 수 있었습니다. 제가 지식생산에 많은 기여를 하지 못한 것이 아쉽지만, 이후의 연구에 수업 중 얻은 지식을 접목하여 보다 많은 지식창출을 할 수 있도록 하겠습니다.

[참고 문헌]


[1] 이상구, 이재화 (2019). 학생중심의 대학 이산수학 강의 운영사례, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 33(1), 1-19.

[2] Natanael Karjanto, Sang-Gu Lee*, Jae Hwa Lee (2019). Flipped Class with Electronic Book and SageMathCell for Linear Algebra, Electronic Journal of Mathematics & Technology (eJMT), 12(4), 109-120.

https://php.radford.edu/~ejmt/ContentIndex.php 

[3] 이상구, 이재화, 김영록, 함윤미 (2018). 4차 산업혁명에 대응하는 대학수학교육: 선형대수학과 산업수학을 중심으로, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 32(3), 245-255.

[4] 이상구, 이재화, 박경은 (2017). 디지털 시대의 대학수학교육: 선형대수학을 중심으로, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 31(4), 367-387.

[5] 이상구, 이재화, 박경은 (2017). 대화형 수학 디지털교과서 개발과 활용 사례 연구: 선형대수학을 중심으로, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 31(2), 241-255.

[6] 이상구, 이재화, 박준현, 김응기 (2016). ‘SageMath를 활용한 ‘대화형 공학수학 실습실’의 개발과 활용, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 30(3), 281-294.

[7] 이상구, 이긍희, 최용석, 이재화, 이지영 (2015). ‘R을 활용한 ‘대화형 통계학 입문 실습실’ 개발과 활용', 한국수학교육학회지 시리즈 E <수학교육 논문집>, 29(4), 573-588.

[8] 박경은, 이상구 (2015). ‘컴퓨팅 사고력(Computational thinking)’ 향상과 Sage 도구를 이용한 수학교육, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 29(1), 19-33.

[9] 이상구, 이재윤, 박경은, 이재화, 안승철 (2015). '수학과 예술을 3D 프린팅으로 연결하는 융합인재교육', 한국수학교육학회지 시리즈 E <수학교육 논문집>, 29(1), 35-49.

[10] 이상구, 김경원 (2013). 모바일 선형대수학 스마트폰 콘텐츠 개발과 활용, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 27(2), 121-134.

[11] 김덕선, 이상구, Greg Markowsky (2010). Mobile Sage-Math for Linear Algebra and its Application, Electronic Journal of Mathematics & Technology (eJMT), 4(3), 1-13. 

https://php.radford.edu/~ejmt/ContentIndex.php 

[12] 이상구, 고래영, 이재화 (2010). 신종 인플루엔자의 수학적 모델링, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 24(4), 877-889.

[13] 이상구, 고래영, 김덕선, 박진영 (2009). 모바일 환경에서의 Sage-Math의 개발과 선형대수학에서의 활용, 한국수학교육학회지 시리즈 E <수학교육 논문집>, 23(4), 483-506.

[14] 이상구, 김영록, 박준현, 김응기, 이재화 (2016). 최신 공학수학 with Sage, 한빛아카데미,

[15] Sang-Gu Lee, Jon-Lark KIM, In-Jae KIM, Namyong LEE, Ajit KUMAR, Phong VU, Victoria LANG, Jae Hwa Lee, Linear Algebra (English version), 온드림 빅북총서 001, 교보문고 POD (2016. 1. 20.)

[16] 이상구, 이재화, 김경원, [빅북] 선형대수학, 교보문고 POD (2014. 9.)

[17] Sang-Gu Lee, Eung-Ki Kim, Yoonmee Ham, Ajit Kumar, Robert Beezer, Quoc-Phong Vu, Lois Simon, Suk-Geun Hwang, Calculus, KyungMoonSa,  March. 5, 2014.



읽을거리 1


     “선형대수학과 구글(Google) 검색엔진”

 

             - 페이지랭크 알고리즘

 

                https://www.scienceall.com/미래를-여는-수학-⑦-Google-검색의-비밀은/


                                                           글  이상구 성균관대 수학과 교수1)



  영국 파이낸셜타임스(FT)와 컨설팅그룹 밀워드브라운이 공동 조사한 ‘2010 글로벌 100대 브랜드 기업’을 보면 랭킹 1위는 미국의 인터넷 기업 구글로, 브랜드 가치가 1,143억 달러를 기록해 2007년부터 4년 연속 최고의 자리를 지켰다.2) 최근 구글의 모토로라 인수가 삼성과 한국의 경제에 큰 영향을 줄 것이라는 언론 보도를 접하였듯이 격변하는 환경에서 ‘모든 학생은 왜 수학을 배워야 하는가?’에 대한 답의 하나로 본 원고에서는 경제와 생활에 막대한 영향을 미치는 “구글 검색 엔진 속의 수학이론”에 대하여 소개한다.



  구글(Google)의 역사는 Matrix Computation의 저자 Gene Golub이 강의하던 스탠퍼드대의 20대 초반의 대학원생 래리 페이지(Larry Page)와 세르게이 브린(Sergey Brin)이 1995년 기존의 검색엔진들이 보여주는 정리되지 않는 결과물에 불만을 가지고 새로운 검색기법 연구에 몰두하여 마침내 페이지랭크(PageRank) 기술과 링크(link)의 매칭기술을 개발하는 데 성공하면서 시작된다. 이들은 ‘이 사이트가 링크를 만들어 연결시켜 줄 얼마만큼의 가치를 가지고 있을까?’라는 기준을 가지고 검색된 사이트들의 순위를 매기는 구글 특유의 차별화된 검색방법을 확립한다.

  페이지와 브린이 인터넷의 광대한 정보를 구글이 모두 담겠다는 의지를 담고, 미국인 수학자 Edward Kasner의 조카인 Milton Sirota가 10의 100승을 뜻하는 말로 만든 'googol'이라는 신조어를 변형시켜 처음 구글이란 말을 쓴 것은 1997년이었다.

  1998년 4월 개최된 월드와이드웹 컨소시엄(W3C)에서 페이지와 브린은 자신들의 연구 결과를 발표하게 되고, 이때부터 검색엔진 업계와 학계에서 관심을 끌기 시작했다. 구글은 사이트가 가지고 있는 메타태그나 키워드에만 의지하지 않고 페이지랭크라는 독특한 기법을 사용하여 웹페이지의 공정한 순위를 매긴다.

 순수하게 수학적으로 접근한 구글 검색엔진의 새로운 아이디어와 수학적 알고리즘인 구글 행렬과 페이지랭크를 계산하는 방법은 인터넷 검색엔진 시장에 획기적인 새 패러다임을 제공하였다. 이를 통하여 학생들이 대학에서 배우는 선형대수학의 기본적인 내용이 생활 속에 널리 이용되고 있음을 확인 할 수 있다.


1. 구글 검색엔진의 기본 아이디어


 우리는 구글 검색엔진에 사용된 페이지랭크를 통한 웹페이지의 외부인기도가 검색 순위에 반영될 때 페이지랭크 점수가 어떻게 구해지는지 알아보고 그 뒤에 숨어있는 수학적 아이디어의 핵심을 찾아 설명하도록 한다.

 웹페이지에 대한 객관적인 순위를 만들어 내기 위하여 구글은 인터넷의 광범위한 구조를 직접 이용한다. 대부분의 다른 검색엔진들은 관계있는 사이트를 결정하기 위해 웹페이지의 제목과 내용을 체크한다. 그러나 구글은 한 웹페이지에서 다른 웹페이지로 연결하는 링크가 있으면, 그 링크를 일종의 투표로 본다. 많이 투표된 웹페이지를 중심으로 구글이 평가를 하게 된다. 구글의 페이지랭크는 어떤 웹페이지가 다른 웹페이지와 밀접한 관계가 있는지를 결정하고 관련된 구조를 표현하기 위해 하이퍼링크(Hyperlink)3) 행렬을 만들고 행렬의 가장 큰 고유값을 이용해서 검색에서 가장 근접한 사이트들을 찾아내는 것이다. 이 과정에서 구글은 Power Method(거듭제곱법)와 페이지랭크 연산법을 이용한다.

  구글과 같은 검색엔진이 수행하는 기본적인 업무 중 첫 번째는 인터넷에 상주하며 사용자들이 접근하는 웹페이지를 파악하는 것이다. 두 번째 작업은 파악된 웹페이지에 대한 데이터를 수집하는 것이다. 수집된 데이터들은 검색어와 관련된 단어나 문구를 검색하는데 효과적으로 사용하게 된다. 세 번째 단계는 데이터로 수집한 웹페이지에 중요도(중요도: 웹페이지가 가지고 있는 중요성을 다른 웹페이지와 비교하여 점수로 표현한 것)를 기록하고 사용자가 검색을 할 때 수집하여 가지고 있던 웹페이지들의 데이터 중에 좀 더 중요한 자료를 검색결과의 상단에 보여주는 것이다.

  우리는 이 세 번째 과정에서 수집된 웹페이지 데이터들의 집합에서 각각의 웹페이지에 대한 중요도를 어떠한 방법으로 결정하며 그 비율을 어떻게 정했는지에 대해 알아본다.


2. 페이지랭크(PageRank)공식의 건설


  구글의 페이지랭크라는 개념은 쉽게 이야기해서 ‘사람들이 링크를 많이 거는 웹페이지는 사람들이 많이 찾아가는 곳일 테고, 그 만큼 정확한 정보가 있는 웹페이지일 것이므로 웹페이지의 페이지랭크 점수를 높게 주자.’ 라는 이론이다.

 페이지랭크는 임의의 방문자가 어떤 웹페이지를 방문하는 빈도로 이해될 수도 있다. 새로운 웹페이지는 자신이 담고 있는 링크의 적절성에 따라 페이지랭크를 증가시키기도 하고, 감소시키기도 한다. (Avrachenkov & Litvak, 2005)

  이제 구글 검색엔진안의 수학적 모델에 대하여 살펴보자.


   1단계: 인접(adjacency) 행렬의 건설

    

[그림 1] 5개 웹페이지로 이루어진 간단한 웹


  위의 그림은 간단한 웹을 표현한 것이다. 주어진 웹페이지들로부터 얻어진 위의 연결관계를 다음과 같이 인접행렬 를 사용하여 나타낼 수 있다. (Page; Brin; Motwani & Winograd, 1998)

                        (2)

 이 경우 [그림 1]의 웹페이지 e는 다른 웹페이지로의 링크를 가지고 있지 않으므로 행렬 의 마지막 열은 0의 값을 갖는다. dangling node4)라 불리는 외부로의 링크를 가지지 않는 웹페이지는 특별한 케이스이다. 게다가 인접행렬을 만들 때 각 웹페이지의 자기 자신으로의 링크는 무시하므로 행렬 의 대각선 성분은 모두 0의 값을 갖는 것을 알 수 있다.


  2단계: 열정규화된 인접행렬 의 건설

  행렬 의 각각의 열 의 성분들의 합으로 나누어 새로운 행렬 를 얻는다. 이 행렬을 열정규화된 인접행렬이라고 한다. 행렬 의 열을 라 하면 다음과 같은 공식에 의해 얻어진다.

         

  이 과정을 식 (2)의 행렬 에 적용하면 

                  (3)

를 얻는다. 


   3단계: 행렬 의 열 stochastic화

   전 단계에서 얻어진 행렬 가 바로 페이지랭크 알고리즘에 이용되는 것은 아니다. 그 이유는 페이지랭크 알고리즘의 수렴성을 확보하기 위해서는 stochastic 행렬이 필요한데, 행렬 는 dangling node에 의해 열 stochastic 행렬이 아닐 수 있기 때문이다. 열stochastic은 ‘행렬의 모든 성분이 음수가 아니어야 하고 열의 합이 모두 1이어야 한다.’ 일단 위의 행렬 는 dangling node인 웹페이지에 의해 마지막 열의 합이 0이므로 열 stochastic 행렬이 아니다. 그래서 행렬 로부터 모든 열의 합을 1이 되는 열 stochastic 행렬 를 다음과 같이 정의 한다.

        

  여기서 벡터 는 모든 성분이 1인 열벡터이고, 이면 이고 이면 인 열벡터이다. 그러면 행렬 로 부터 열 stochastic행렬 를 건설할 수 있다. Gerschgorin정리에 의해 열 stochastic 행렬(혹은 Markov행렬) 의 가장 큰 고유값의 크기 는 1보다 작거나 같다. 또한 의 행벡터(혹은 열벡터)의 합은 0이 되는데, 이것은 trivial sum이 아니다. 따라서 으로 부터 어떤 에 대하여 인 고유값이 존재함을 알 수 있다. 그런데 문제점은 링크행렬이 크기가 매우 큰 sparse행렬이라는 것이다. 따라서 일반적인 계산을 통해 고유벡터를 구하기보다는 거듭제곱법(Power method)를 사용하는 것이 효율적이다. 우선 식 (3)의 행렬 를 사용하여 행렬 를 만들면 다음과 같이 된다.

                   (4)


 4단계: 구글 행렬 의 건설

 행렬 가 유일한 stationary distribution 벡터를 갖는다는 것을 보증할 수 없기 때문에 아직 끝난 것이 아니다. (즉, 정확한 하나의 페이지랭크 벡터가 없을 수도 있다는 의미) 따라서 수렴하는 하나의 stationary distribution 벡터 가 있다는 것을 보장하기 위해 행렬 가 irreducible인 동시에 stochastic임을 확실히 해야 한다. 정의에 의하여 “주어진 정사각행렬 에 대하여, 인 치환 행렬 와 정사각행렬 , 가 존재하지 않을 때 행렬 는 irreducible이다.” 행렬이 irreducible인 것은 대응하는 그래프가 strongly connected하다는 것과 동치이다.(Horn & Johnson, 1985) 또 가 primitive 행렬이면, 언제나 는 irreducible 행렬이다. 이에 보태서 주어진 정사각행렬 가 primitive일 필요충분조건은 어떤 자연수 에 대하여 가 양의 행렬이 되는 것이다.5) 그래서 우리는 식 (4)의 행렬 를 이용하여 irreducible한 열 stochastic 행렬 를 다음과 같이 정의한다.

              (5)

여기서 이고 이다. 구글검색에서는 보통 을 0.85로 이용한다. 이 행렬 가 바로 우리가 필요로 했던 구글행렬이 된다.

   이제 페이지랭크를 구하는 기본 알고리즘인 식(1) 에 행렬 대신 행렬 를 대입하여 새 페이지랭크 알고리즘을 다음과 같이 정의한다.   

  그러나 크기가 1인 고유값이 2개 이상 존재하면 거듭제곱법의 수렴성이 보장되지 않는다. 또한 행렬의 주위에 블록 행렬이 있다면, 페이지 랭킹에서 아예 제외되는 웹페이지가 생기는데, 이런 경우 현실 문제를 적절히 반영한다고 볼 수 없다. 따라서 우리가 다루기를 원하는 행렬의 의미를 모두 담고 있으면서 가장 큰 고유값이 1개뿐인(대수적 중복도가 1인)행렬인 primitive 행렬로 변환시킨 것이 구글 행렬이다. 이 부분의 이론에 대하여 소개하고 다음 단계로 넘어간다.

 집합 를 행렬 의 고유값들의 집합, 정사각행렬 의 spectral radius를 라 하면 Perron-Frobenius정리에 의해 구글 행렬 에 대하여 =1인 고유값 1은 의 Gerschgorin circle 상의 유일한 고유값이고, 고유값 1의 대수적 중복도는 1임을 알게 된다. 그리고 는 행렬 의 유일한 가장 큰 고유값이 된다. 더구나 대응하는 그래프는 strongly connected이고 어떤 자연수 에 대하여 가 양의 행렬이 되는 irreducible행렬 는 primitive 행렬이다. 즉, 구글 행렬 가 primitive 행렬이라는 의미이다.(Horn & Johnson, 1985)

   여기서 이고 인 대수적 중복도가 1인 가장 큰 고유값 의 Perron 근(root)라 하고, 인 양의 고유벡터 가 존재한다. 그리고 이면서 이고 의 고유벡터를 의 Perron 벡터 라 한다.

   위의 건설 과정에서 우리가 건설한 구글 행렬이 수렴하는 유일한 페이지랭크 벡터를 갖는다는 것을 보인 셈이다.

   이제 수렴성을 분석해 보자. 만일 행렬 가 (와 마찬가지로) primitive 행렬이라 하자. 그러면 가 존재한다. 특히, 가 이 행렬 의 Perron 근이고, 를 각각 primitive 행렬 의 Perron 벡터 라 할 때 임을 알고 있다.(Meyer, 2000) 이를 이용하면 의 (right) Perron 벡터라 하고, 의 Perron 벡터라 하면, == =>0를 얻는다. 벡터 는 모든 성분을 1로 갖는 열 벡터이다.

  이것으로부터 즉, 의 (right) Perron 벡터임이 확인되고, 따라서 가 되어 의 (left) Perron 벡터임이 확인된다. 따라서 인 임의의 초기벡터 에 대하여 이며, primitive 행렬 에 대하여 이고  이다. 인 유일한 단위 벡터 가 존재한다는 의미이다.

  수렴성을 보여주는 위의 설명은 구글행렬 가 벡터 를 (right)  Perron 벡터로 가지는 것과 그에 대응하는 대수적 중복도가 1인 고유값 을 가진다는 것을 확인해 준다. 그리고 이 알고리즘을 이용하면 반복연산을 통하여  를 만족하는 근사값을 페이지랭크 벡터 로 언제나 구할 수 있다는 것이다. 이 가 구글행렬 의 Perron root라 하고, 인 양의 고유벡터 가 존재한다. 그리고 이면서 이고 인 행렬 의 고유벡터는 행렬 의 페이지랭크 벡터이고, Perron 벡터이다. 따라서 행렬 의 페이지랭크 벡터를 찾는 것은 행렬 의 (dominant right) 고유벡터 또는 의 (dominant left) 고유벡터, 즉, Perron 벡터를 찾는 것과 동치이다.

   이제 구글 행렬 의 페이지랭크 벡터를 구하는 문제를 생각하자, 구글은 수십억대의 홈페이지를 다루므로, 실제로 그런 크기의 행렬 를 만들어 Perron 벡터를 구하는 것은 현실과 다르다. 인터넷상의 웹페이지는 적어도 80억 이상의 개수를 가지므로 간단하게 계산되어질 수 없다. 따라서 실제로는 페이지랭크 벡터를 아래에 설명하는 거듭제곱법을 이용하여 구한다. (Langville & Meyer, 2004)


  단계 5: 거듭제곱법(Power method)

            

  거듭제곱법(이상구, 2009)을 이용한 수렴속도는 라고 할 때 임과 페이지와 브린이 로 놓으면 대개 50번에서 100번의 연산을 통하여 원하는 페이지랭크 벡터를 구할 수 있음을 보였다. (Langville & Meyer, 2003)

  이제 어떻게 페이지랭크 벡터가 계산되는지를 확인해 보자. 첫째 웹페이지 의 페이지랭크는 페이지랭크 벡터 번째 성분인 값 이다. 여기서 벡터 인 Perron 벡터이다. 이 벡터 를 통해 웹상에서의 페이지 의 순위를 가늠해 볼 수 있는 점수를 구한다.

  위의 전 과정을 요약하면 다음과 같다. 웹의 연결성으로부터 얻은 행렬 의 각 성분을 를 이용하여 정규화한 행렬 를 만들게 된다. 그리고 행렬 로부터 열 stochastic 행렬인 로 정의하고, 이 때 벡터 는 모든 성분이 1인 열(column) 벡터이고, 벡터 이면 이고 이면 인 열벡터이다. 이로부터 여기서 의 값인 0.85로 하고 로 정의하여 구글행렬 를 얻은 것이다. 을 0.85로 선택한 것은 임의로 한 것이 아니다. 이와 관련된 자세한 내용은 (Haveliwala & Kamvar, 2003)에 소개 되었다.

   이와 같이 문제 표현형식을 바꾸면, 웹페이지의 순위를 매기기 위한 문제가 정사각행렬에서 고유벡터를 찾는 우리가 잘 아는 문제로 바뀌게 된다.(정의에 의해 행렬 의 고유값 와 고유벡터 는 방정식 를 만족한다.) 위 행렬 를 구글 행렬이라 한다. 이제는 열 stochastic 행렬 의 가장 큰 고유값 1에 대응하는 고유벡터 를 구하는 일이 남는다.

 위의 전 과정을 예를 들어 설명하면 다음과 같다. 미리 언급하였듯이 구글에서는 을 사용한다. 그래서 구글에서 사용하는 의 값을 사용하여 얻은 식 (5)의 행렬 를 이용하여 행렬 를 구하면 아래와 같다.

            

 페이지랭크가 담고 있는 내용을 정리하면 웹페이지 의 페이지랭크는 인 Perron 벡터 번째 성분의 값이고 페이지랭크 벡터는 각 웹페이지에 접근하게 될 가능성을 반영하는 Probability 벡터이다.(Langville & Meyer, 2003)

  우리가 사용하고 있는 인터넷의 모든 사이트(웹페이지)가 개의 웹페이지로 만들어진 웹이라 하자. 그러면 인터넷 사용자들은 어떠한 웹페이지를 시작페이지로 설정하여 인터넷을 이용하게 될 것이다.

   인터넷을 이용하던 중에 개의 링크를 가지고 있는 어느 특정 웹페이지를 열어보게 된다면 그 웹페이지에서 의 확률(구글에서는 을 0.85를 사용하였다.)을 가지고 웹페이지가 가지고 있는 임의의 링크를 선택을 하게 된다. 웹페이지에 있는 링크를 선택하지 않을 확률은 이 되고 인터넷 사용자가 선택할 수 있는 모든 경우의 수는 두 확률로 합으로 계산이 된다. 즉, (여기서 은 웹페이지가 가진 링크의 개수, 은 인터넷 웹상의 모든 웹페이지의 개수)가 된다.

   구글의 페이지랭크 알고리즘에서 기본 전제로 한 ‘중요한 웹페이지는 다른 웹페이지로부터 더 많이 연결되어있다.’에 따라 인터넷 사용자는 자주 페이지랭크 점수가 높은 웹페이지로 연결되는 링크를 더 자주 선택하게 되고 페이지랭크 점수가 높은 페이지에 많은 인터넷 사용자가 접근을 하게 된다.

   접근을 하는 횟수가 다른 웹페이지에 비하여 많다는 것은 바꿔 생각하면 그만큼 인터넷 사용자들이 해당 웹페이지에 머물게 된다는 것이다. 즉, 식 에서 정규화 된 벡터 의 성분 는 인터넷 사용자들이 웹페이지 에서 머무르는 짧은 시간을 의미하는 것으로 판단 생각할 수 있게 된다. 링크구조를 데이터베이스로 가지는 검색엔진의 설계에서 링크구조는 고정적이다. 고정된 링크구조를 가지는 웹에서는 한번 정의된 는 계속해서 사용할 수 있다. 하지만 인터넷에서의 웹페이지는 단 하나의 구조로 고정되어 있지 않는다. 수많은 사이트와 웹페이지는  생성되었다가 사라지기도 하고 그들 사이를 잊는 링크들 또한 필요성에 따라 계속해서 생겨나고 사라지는 동적인 공간이기 때문에 웹페이지의 페이지랭크 계산을 통한 고유벡터 의 개선은 매우 중요한 문제가 된다. 페이지랭크 기술은 키워드별로 인터넷 사용자가 클릭하는 웹페이지의 경로를 알고리즘화해 웹페이지들 간의 상호 관련성을 계산해내고, 웹페이지간의 관련성과 웹페이지내의 관련어 배치 등을 고려해 고객이 원하는 결과를 가장 빠르고 정확하게 제공하는 기술이다. 구글 검색엔진의 경우 어떤 내용을 검색창에 넣어도 0.5초면 자신이 찾는 가장 근접한 검색결과를 제시해준다. 이 기능은 아직 어떤 검색엔진도 따라올 수 없는 독보적 기술로 평가받고 있다.

  현재 구글은 다양한 분야로 사업을 확장하고 있다. 수학자는 ‘구글 북스 라이브러리 프로젝트’6)에 대하여도 관심을 가져야 한다. 구글의 목표 중 하나가 20세기에 발간된 모든 책을 전자화 한다는 것이라고 들었다. 구글은 이미 일본 게이오대학과 미국 하버드대학 등 세계 40곳 이상의 도서관 및 3만 곳 이상의 출판사와 연계해 지금까지 1500만 권 이상을 전자화했다. 2011년 3월에는 영국의 대영도서관 소장 장서 25만 권을 전자화하기로 합의했다고 발표했다. 이런 변화가 수학을 하는 우리에게 조만간 또 다른 큰 영향을 미칠 것이라는 것을 느낄 수 있다.


3. 결론


 인류 역사의 혁명적 발전 시기마다 그 사회가 안고 있던 문제를 해결하는 과정의 중심에 수학이 있었다. 우리나라의 학생들은 보통 수학공부를 하는 이유를 ‘입학시험을 잘 보기위해서’라고 생각하고 있다. 따라서 수학은 우리의 삶에 불필요한 과목이라고 생각하기도 한다. 본 원고에서는 구글 검색 엔진 속의 존재하는 선형대수학 이론의 일부를 간략하게 소개했다. 이는 수학의 발전이 인류 사회의 발전 역사와 함께한다는 것을 보여주는 좋은 예가 될 수 있다.


4. 참고문헌


이상구 (2009). 현대선형대수학 3판, 서울 : 경문사

Avrachenkov K. & Litvak N. (2005). The Effect of New Links on Google PageRank

http://wwwhome.math.utwente.nl/~litvakn/StochModels06.pdf

Brin S.; Page L.; Motwami R. & Winograd T. (1998). The PageRank Citation Ranking: Bringing Order to the Web, Technical report, Computer Science Department, Stanford University, Stanford, CA

Haveliwala T. H. & Kamvar S. D. (2003). The Second Eigenvalue of the Google Matrix, Stanford University Technical Report

http://www.stanford.edu/~sdkamvar/papers/secondeigenvalue.pdf

Horn R. & Johnson C.R. (1985). Matrix Analysis, Cambridge, 1985 ISBN 0521305861

Langville A. N. & Meyer C. D. (2003). Fiddling with PageRank

http://meyer.math.ncsu.edu/Meyer/PS_Files/FiddlingPageRank.pdf

Langville A. N. & Meyer C. D. (2004). The Use of the Linear Algebra by Web Search Engines

http://meyer.math.ncsu.edu/Meyer/PS_Files/IMAGE.pdf

Langville A. N. & Meyer C. D. (2005). Deeper inside PageRank, Internet Math.

Meyer C. D. (2000). Matrix Analysis and Applied Linear Algebra, SIAM, Philadelphia.    ■


                               


읽을거리 2


[수학동아 2016년 4월호 특별기획] AlphaGo-Special-p.50-p.57


인공지능, 인간을 뛰어넘은 비밀


 

  지난 3월 9일부터 3월 15일까지 서울 광화문 포시즌스 호텔 특별 대국장에서 펼쳐졌던 바둑 최강자 이세돌 9단과 인공지능 프로그램 아파고의 대결은 알파고의 승리로 끝났다. 대부분의 전문가들이 이세돌 9단의 압승을 예견했으나, 결과는 알파고의 승리였다.


  알파고는 어떻게 바둑을 공부해서 이세돌을 이길 수 있었던 것인지 궁금하다. 또, 알파고 같은 인공지능 프로그램을 만들기 위해서는 어떤 수학이 필요할까?


김경환 기자(dallgudot@donga.com) 도움 이상구(성균관대 수학과 교수), 김용대(서울대 통계학과 교수), 김동근(아주대 전자공학과 교수), 신진우(KAIST 전기 및 전자공학과 교수), 최승진(포항공과대 컴퓨터공학과 교수)

            

 

알파고는 어떻게 바둑을 둘까?


1. 학습하는 컴퓨터

알파고는 바둑 두는 법을 어떻게 배웠을까? 사람이 학교에서 공부하는 것처럼 정해진 교육과정에 따라 공부했을까? 알파고는 ‘딥러닝’을 활용해 프로 바둑기사들의 패턴을 학습했다.

  딥러닝은 ‘기계학습’의 방법 중 하나다. 기계학습이란 컴퓨터에게 방대한 데이터를 주고 스스로 일반적인 패턴을 찾는 것을 의미한다. 딥러닝은 데이터만 넣어주면 알아서 각각의 중요한 특징을 찾아 스스로 학습한다.



파블로프의 개 실험

보통의 개는 음식을 보면 침이 나온다. 그런데 음식을 줄 때 종소리를 함께 들려주는 훈련을 반복하면, 청각 신경과 침을 분비하는 신경의 ‘연결’이 강화된다. 결과적으로 개는 종소리만 흔들어줘도 침이 분비된다.

  이 실험은 러시아의 생리학자 이반 파블로프의 대표적인 실험으로, 이 원리는 인공지능을 학습시키는 데도 이용된다. 인공지능이 예측을 잘 할 수 있는 방향으로 인공신경을 강화하며 학습하는 것이다.

                       

 


2. 스스로 공부한다!

알파고를 개발한 구글의 인공지능 개발사 ‘딥마인드’의 트레이드 마크는 ‘강화학습’이다. 강화학습은 알파고와 알파고가 경기하며 배우는 것이다. 기존의 데이터만으로는 프로만큼 바둑을 두기 힘들었던 알파고는 강화학습으로 새로운 양질의 데이터를 만들어 바둑 실력을 키웠다.


  알파고는 수많은 인공신경 중 하나의 수치를 무작위로 바꿔가며 승률이 더 높은 경우를 강화했다. 예를 들어, 한 신경의 수치가 0.3인 알파고와 0.4인 알파고가 바둑을 여러 번 두게 해 이긴 쪽 수치로 신경을 강화한다.

                        


3. 무작위 대입 VS 무작위 표본 추출

바둑은 한 경기에서 나올 수 있는 경우의 수가 2.08 X 으로 어마어마하다. 이 때문에 모든 경우를 탐색해 수를 생각하는 알고리즘인 ‘무작위 대입’은 비효율적이다. 바둑에 비해 경우의 수가 적은 체스에서는 무작위 대입으로 사람을 이길 수 있었지만, 바둑은 그것이 불가능했다.

  그래서 알파고는 ‘무작위 표본 추출’7)이라는 알고리즘을 이용해 표본을 뽑아 탐색하며 바둑을 둔다. 표본이 전체를 나타낼 수 있다는 것을 활용한 것이다. 표본 집단의 크기가 커질수록 정확도가 높아진다. 무작위 표본 추출은 알파고가 다양한 상황에서 가장 좋은 수를 고르도록 한다.


 

무작위 대입

9번

13,242번

298,313번

…….

12번

무작위 표본 추출

0번

12번

703번

…….

1번


  무작위 대입은 모든 데이터를 다 따지는 것이고, 무작위 표본 추출은 일부 데이터만 뽑은 뒤 그 안에서 따지는 것이다. 무작위로 표본을 뽑으면 결과는 거의 같으면서도 경우의 수가 줄어든다.



인공지능이 궁금해? 수학부터 공부하자!


이세돌 9단과 알파고 간의 바둑 대결은 그 대결 자체로도 관심을 끌었지만, 인공지능에 대한 관심으로도 이어졌다. 그러면 훗날 인공지능 연구에 동참하려면 무엇을 공부해야 할까? 인공지능을 이해하고, 개발하기 위해 반드시 알아야 하는 수학의 분야를 알아보자.


선형대수학8)은 필수!

인공지능의 기반인 컴퓨터가 어떤 문제를 해결하게 하기 위해서는 ‘선형화’라는 과정이 필요하다. 선형화는 문제를 컴퓨터가 이해하는 언어로 바꾸는 과정으로, 수학적으로 ‘행렬’이 포함된 식으로 바꾸는 것을 말한다. 예를 들어 복잡한 3차 미분방정식을 선형화하면 훨씬 간단한 1차 미분방정식 3개로 된 식이 된다. 그러면 행렬의 성질을 이용해 쉽게 답을 구할 수 있다.


 그런데 행렬의 크기가 100만 X 100만 같이 커지면 슈퍼컴퓨터가 풀더라도 시간이 굉장히 오래 걸린다. 이것을 해결하는 답은 선형대수학에 있다.

  선형대수학은 크기가 큰 행렬을 컴퓨터가 효과적으로 다루도록 도와준다. 푸는 데 10년 걸릴 문제를 순식간에 풀도록 바꿔주는 것이다.


  컴퓨터에게 선형화한 문제를 해결하도록 시키려면 컴퓨터가 이해할 수 있도록 알고리즘을 짜야 한다. 여기에는 ‘수치적 선형대수학’과 ‘수치해석학’을 이용한다. 컴퓨터 프로그래머는 이 알고리즘으로 코딩해 프로그램을 만든다.


선형대수학은 이런 곳에도 쓰인다!

선형대수학은 인공지능뿐만 아니라 자연과학과 공학, 사회과학의 여러 분야에서 활용되고 있다. 1890년에 혜성 궤도를 관측할 때부터 쓰이기 시작했고, 현대에는 빅데이터 분석에도 쓰이고 있다. 또, 우리가 많이 쓰는 구글 검색 엔진 속에도 선형대수학이 이용된다. 전 세계 1위 브랜드 가치를 가진 구글 신화를 창조할 수 있었던 이유는 선형대수학을 이용한 검색엔진 덕분이었던 것이다.


빠지면 안 되는 확률

인공지능은 빅데이터를 입력해서 의사결정과 데이터를 연결해주는 모형(함수)을 만드는 것이라 할 수 있다. 이때 다양한 모형을 만들어 어떤 모형이 예측력이 가장 좋은지 알아내야 한다. 예측을 잘할수록 진보한 인공지능이다. 예를 들어, 알파고의 경우 현재 바둑판의 상황에서 어느 곳에 놓아야 이길지를 예측해 가장 좋은 수를 선택한다.


  확률론은 모형을 어떻게 만들어야 예측을 잘 할 수 있는지 연구할 때 쓰인다. 인공지능은 데이터를 기반으로 하기 때문에 모든 판단을 확률적으로 하기 때문이다. 확률론은 모형을 만들 때 직접적으로 쓰이지는 않지만, 모형을 만드는 원리를 제공한다.


  이상구 성균관대 수학과 교수는 “알파고 같은 인공지능을 포함해 사물인터넷, 드론 등 관심이 가는 분야가 있다면, 그것에 쓰인 학문을 직접 찾아 공부하는 것이 중요하다”며, “수학, 통계학, 컴퓨터 과학 등 다양한 학문이 관련 있을 텐데, 이를 통해 창의적인 아이디어를 스스로 내보면 큰 도움이 될 것”이라며 관심 있는 분야에 대한 적극적인 행동을 당부했다.


확률론을 쓰는 인공지능도 있다

확률론을 이용한 인공지능 알고리즘에는 ‘베이즈 확률론’이 쓰인다. 베이즈 확률론은 18세기 통계학자 토머스 베이즈의 이름을 딴 이론으로 확률을 ‘지식의 상태를 측정’하는 것이라고 본다. 현대의 많은 기계 학습 방법은 이 원리에 의해 만들어졌다. 하지만 딥러닝에는 이 방법이 쓰이지 않는다. 최근 인공지능 개발에 있어서 베이즈 확률론은 대세가 아니다.


인공지능 수학자도 등장할까?

인공지능이 넘어서기 힘들 것이라던 바둑에서 인공지능이 승리를 거두었다. 그런데 여기서 한 가지 의문이 든다. 미래에는 인공지능이 수학을 연구하는 날이 올 수도 있지 않을까? 박형주 국가수리과학연구소 소장은 “이미 수학의 여러 정리를 컴퓨터가 증명하게 하는 분야가 있다”며, “아직 사람의 손에 의해 증명된 문제를 시켜보는 단계에 지나지 않지만, 미래에는 사람처럼 새로운 것을 증명해내는 인공지능이 나올 수도 있다”고 말했다.


  엄상일 KAIST 수리과학과 교수는 “컴퓨터가 사람이 한 증명을 보고 맞는지 틀린지를 판단하는 소프트웨어는 이미 쓰이고 있다”며, “하지만 수학자처럼 새로운 것을 창조해내는 인공지능이 나올지는 아직 지켜봐야 할 것”이라고 조심스럽게 미래를 전망했다.


  인공지능의 발전은 우리의 미래를 어떻게 바꿔놓을까? 영화 ‘매트릭스’나 ‘터미네이터’에 나오는 암울한 미래일지, 영화 ‘로봇, 소리’처럼 사람과 인공지능이 서로 도우며 공존하는 아름다운 미래일지 궁금하다. 만약 이번 대국으로 인공지능에 관심이 생겼다면, 관련된 지식을 늘려보는 것은 어떨까? 그렇게 시작한 공부가 미래 인공지능 역사의 중심에 서게 되는 출발점이 될지도 모른다.


            [수학동아 2016년 4월호 특별기획] AlphaGo-Special-p.50-p.57

 

 

[부록 5] 이산수학

 


Ch 6, Counting Methods and the Pigeonhole Principle

      http://matrix.skku.ac.kr/2018-DM/DM-Ch-6-Lab.html  
     
https://youtu.be/I6XW6DKLoCU
     
http://matrix.skku.ac.kr/2018-DM-Sol/Ch6/
       학생 발표 김세진 
https://youtu.be/_lxv-cysbGQ


Ch 8, Graph Theory   - Lecture Note
 
http://matrix.skku.ac.kr/2018-DM/DM-Ch-8-Lab.html 
* Graph Terminology and Lab :
     
http://matrix.skku.ac.kr/2014-Album/Graph-Project.html 

     Solution http://matrix.skku.ac.kr/2018-DM-Sol/Ch8/
 

Ch 9, Trees  - Lecture Note
 
http://matrix.skku.ac.kr/2018-DM/DM-Ch-9-Lab.html
      (Part 1)  
https://youtu.be/v6wQeWmMBq8 
      (Part 2)  
https://youtu.be/gl1cD6-0prs

      문제풀이  http://matrix.skku.ac.kr/2018-DM-Sol/Ch9/ 
      학생발표 오동찬 
https://youtu.be/nvwYSFwCoFo
      학생발표 Simen
https://youtu.be/DzMo4cfDLFY





http://matrix.skku.ac.kr/2018-DM/DM-Ch-9-Lab.html 

print G.spanning_trees_count()

print G.min_spanning_tree()

 

 

Example  3.5

너비우선 탐색 (Breadth-first Search) http://www.aistudy.com/heuristic/breadth-first_search.htm

        

 1. 정점들의 순서를 정하고 (abcdefgh)

 2. 맨 처음 정점을 뿌리(root)로 한다.

 3. a에 인접한 정점 x와 간선(a, x)가 T에 추가되었을 때 사이클을 생성하지 않으면 이들을 T에 추가한다.

​ 4. 3번에서 뿌리와 연결된 레벨 1 짜리 정점들 x에 대해서 같은 작업을 시행한다.

 5. 반복한다.


※ 너비 우선 탐색은 먼저 가로 (같은 레벨 대)를 먼저 완성 시키고 다음 레벨로 넘어가는 형식 이여서 Breadth-first 이라고 하고 깊이 우선 탐색은 끝이 나올 때까지 한쪽 가지를 완성 시키고 다시 돌아오므로 depth-first이라고 합니다. 처음에 선택된 뿌리를 향해 간선을 따라 되돌아가는 행위 때문에 역추적(backtracking)이라고도 한다.


    

    An alternative to breadth-first search is depth-first search(깊이 우선 탐색, DFS), which proceeds to successive levels in a tree at the earliest possible opportunity.


Depth-First Search,

 Idea : proceeds to successive levels in a tree at the earliest possible opportunity.


   
 

 Algorithm  3.7

  Depth-First Search for a Spanning Tree

 This algorithm finds a spanning tree using the depth-first search method.

     Input: A connected graph with vertices ordered

   Output: A spanning tree

  

      vertices of spanning tree edges of spanning tree

      is the root of the spanning tree

     

     

     

     while (true)

       while(there is an edge that when added to does not create a cycle in

          choose the edge with minimum that when added to

             does not create a cycle in

          add to

          add to

          

      

       if

          return

       parent of in // backtrack

   

 


* depth-first search = back tracking (깊이 우선 탐색(depth-first search: DFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택하고, 이 노드에 적용 가능한 동작자 중 하나를 적용하여 트리에 다음 수준(level)의 한 개의 자식노드를 첨가하며, 첨가된 자식 노드가 목표노드일 때까지 앞의 자식 노드의 첨가 과정을 반복해 가는 방식이다.) (부모노드로 되돌아오는 과정을 백트래킹(backtracking)이라 한다.)

            

depth-first search=backtracking

               

Four-Queens Problem

 

 

Programming AI with Leaf/ Face Recognition with Eigenfaces



        

https://en.wikibooks.org/wiki/Programming_AI_with_Leaf/Face_Recognition_with_Eigenfaces

 

 

 

 

읽을거리 3


    인공지능과 AI를 활용한 안면 인식기술

      https://www.sas.com/ko_kr/solutions/ai-mic/blog/face-recognition-technology.html


...



읽을거리 4


            AI 기술로 4년 만에 6조 가치를 만든

 

    세계 최대의 Facial Recognition AI 회사, ‘SenseTime’


[출처] 

https://www.digitalmarketingkorea.co.kr/2018/11/05/ai-기술로-4년-만에-6조-가치를-만든-세계-최대의-facial-recognition-ai-회/ 


...

    대만의 사이버링크사는 인공지능 얼굴인식 엔진 '페이스미'를 컴퓨텍스 2019'에 출품하였다.

           http://www.irobotnews.com/news/articleView.html?idxno=17269



교양교육과정 신규 교과목개발 (보고서)

 

 

[4차산업혁명 융·복합과목]

 

 

『인공지능을 위한 기초수학』

Basic Mathematics for Artificial Intelligence (A.I.에 필요한 기초수학)



 5. 교수방법 및 전략


○ 운영방법

① 교수자가 주차별 학습자료(다양한 온라인 콘텐츠 및 강의 동영상), 토론거리 및 수업계획을 i-campus에 탑재한다. 선형대수학-미분적분학-기초통계를 오픈소스 모바일 무료도구를 이용하여 다룰 수 있게 해 줄 것이며, 기존의 자료


1. SKKU 선형대수학 Lectures

  http://matrix.skku.ac.kr/LA-K/     http://matrix.skku.ac.kr/LA/ 


2. SKKU 미적분학 Lectures

  http://matrix.skku.ac.kr/Cal-Book1/

  http://matrix.skku.ac.kr/Cal-Book/index.html

   Part I   Single Variable Calculus   Part II  Multivariate Calculus


3. 기초 통계학

   R을 활용한 기초 통계학 실습실 Lab 1

   http://matrix.skku.ac.kr/2018-album/R-Sage-Stat-Lab-1.html 

   R을 활용한 기초 통계학 실습실 Lab 2

   http://matrix.skku.ac.kr/2018-album/R-Sage-Stat-Lab-2.html 


4. Mathematics for BigData

  http://matrix.skku.ac.kr/e-math/  


5. SKKU Discrete Mathematics(이산수학) Lectures

  http://matrix.skku.ac.kr/2018-DM/DM-Labs.htm 


  


Mobile Sage Grapher


http://matrix.skku.ac.kr/Mobile-Sage-G/sage-grapher.html


2.2 MNIST 데이터셋을 활용한 손 글씨 숫자 인식 (패턴인식)

인공지능을 위한 기초수학 27(빅데이터와 인공지능 4, MNIST), Basic Math for AI 27

 

다음은 신경망을 활용하여 MNIST 데이터 셋의 손 글씨 숫자를 인식한 사례이다. 자료의 출처는 다음과 같다.

 

[출처]

THE MNIST DATABASE of handwritten digits http://yann.lecun.com/exdb/mnist/

타리크라시드 지음, 송교석 옮김, 신경망 첫걸음, 한빛미디어, 2017.

 

기계 학습의 성과를 벤치마크 하는데 가장 널리 사용되는 MNIST 데이터 셋은 60,000개의 학습 데이터와 10,000개의 테스트 데이터로 구성되어 있다. 각 데이터에는 손으로 쓴 0부터 9까지의 숫자의 이미지와 그 레이블(실제 숫자)이 담겨 있다. 데이터 셋의 각 이미지는 가로, 세로가 각 28픽셀(pixel)28 x 28 = 784개의 숫자를 갖는 벡터로 생각할 수 있으므로, 숫자를 인식하기 위한 신경망의 입력층은 784개의 노드, 출력층은 0부터 9까지의 숫자를 나타내는 10개의 노드로 구성된다. 은닉층의 노드의 개수에 관하여 정해진 방법은 따로 없으나 이 절의 예시코드에서는 100개로 하였다.

 

이제 어떤 숫자를 나타내는 이미지가 있다고 하자. 그러면 이것을 784 x 1의 벡터로 변환하여 신경망의 입력층에 전달한다. 그리고 신경망을 거쳐 얻은 출력층의 신호가 가장 큰 노드의 레이블로 숫자를 판단하게 된다. 예를 들어, 출력층의 신호가 가장 큰 노드의 레이블이 7이면 이를 숫자 7로 판단하게 된다.

 

아래는 https://github.com/freebz/Make-Your-Own-Neural-Network 에 공개된 Python 코드를 일부 수정하여 Sage에서 구현한 것이다. 예를 들어, MNIST 데이터셋으로부터 숫자 7의 이미지를 읽어서 보여준다.

 

[Sage code] http://mathlab.knou.ac.kr:8080/ http://mathlab.knou.ac.kr/r/ http://sage.skku.edu/

# mnist 학습 데이터인 csv 파일을 리스트로 불러오기

import numpy

# 행렬을 시각화하기 위한 라이브러리

import matplotlib.pyplot

import csv

import urllib2

url = 'https://media.githubusercontent.com/media/freebz/Make-Your-Own-Neural-Network/master/mnist_dataset/mnist_test_10.csv'

response = urllib2.urlopen(url)

training_data_file = csv.reader(response)

training_data_list = list(training_data_file)

all_values = training_data_list[0]

image_array = numpy.asfarray(all_values[1:]).reshape((28,28))

matplotlib.pyplot.imshow(image_array, cmap = 'Greys', interpolation = 'None')

matplotlib.pyplot.savefig('foo.png')

response.close()

 

이제 주어진 학습 데이터를 활용하여, 신경망의 적절한 가중치를 얻은 후, 테스트 데이터를 이용하여 신경망의 성능을 판단해보자. 다음은 입력, 은닉, 출력 계층의 신경망으로, MNIST 데이터셋 일부를 학습시켜 테스트용 숫자 이미지를 잘 인식하는지 보여주는 코드이다. 학습 데이터 100, 테스트 데이터 10개를 아래의 자료로부터 사용하였다.

[출처]

https://github.com/freebz/Make-Your-Own-Neural-Network

https://media.githubusercontent.com/media/freebz/Make-Your-Own-Neural-Network/master/mnist_dataset/mnist_train_100.csv

https://media.githubusercontent.com/media/freebz/Make-Your-Own-Neural-Network/master/mnist_dataset/mnist_test_10.csv

 

[Sage code]   http://mathlab.knou.ac.kr:8080/ http://mathlab.knou.ac.kr/r/ http://sage.skku.edu/

# 3계층의 신경망으로 MNIST 데이터를 학습하는 코드

import numpy

# 시그모이드 함수 expit() 사용을 위해 scipy.special 불러오기

import scipy.special

# 행렬을 시각화하기 위한 라이브러리

import matplotlib.pyplot

 

#신경망 클래스의 정의

class neuralNetwork:

# 신경망 초기화하기

def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):

# 입력, 은닉, 출력 계층의 노드 개수 설정

self.inodes = inputnodes

self.hnodes = hiddennodes

self.onodes = outputnodes

# 가중치 행렬 wihwho

# 배열 내 가중치는 w_i_j로 표기. 노드 i에서 다음 계층의 노드 j로 연결됨을 의미

# w11 w21

# w12 w22

self.wih = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))

self.who = numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))

# 학습률

self.lr = learningrate

# 활성화 함수로는 시그모이드 함수를 이용

self.activation_function = lambda x: scipy.special.expit(x)

pass

# 신경망 학습시키기

def train(self, inputs_list, targets_list):

# 입력 리스트를 2차원의 행렬로 변환

inputs = numpy.array(inputs_list, ndmin=2).T

targets = numpy.array(targets_list, ndmin=2).T

# 은닉 계층으로 들어오는 신호를 계산

hidden_inputs = numpy.dot(self.wih, inputs)

# 은닉 계층에서 나가는 신호를 계산

hidden_outputs = self.activation_function(hidden_inputs)

# 최종 출력 계층으로 들어오는 신호를 계산

final_inputs = numpy.dot(self.who, hidden_outputs)

# 최종 출력 계층에서 나가는 신호를 계산

final_outputs = self.activation_function(final_inputs)

# 출력 계층의 오차는 (실제 값 - 계산 값)

output_errors = targets - final_outputs

# 은닉 계층의 오차는 가중치에의해 나뉜 출력 계층의 오차들을 재조합해 계산

hidden_errors = numpy.dot(self.who.T, output_errors)

# 은닉 계층과 출력 계층 간의 가중치 업데이트

self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))

# 입력 계층과 은닉 계층 간의 가중치 업데이트

self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))

pass

# 신경망에 질의하기

def query(self, inputs_list):

# 입력 리스트를 2차원 행렬로 변환

inputs = numpy.array(inputs_list, ndmin=2).T

# 은닉 계층으로 들어오는 신호를 계산

hidden_inputs = numpy.dot(self.wih, inputs)

# 은닉 계층에서 나가는 신호를 계산

hidden_outputs = self.activation_function(hidden_inputs)

# 최종 출력 계층으로 들어오는 신호를 계산

final_inputs = numpy.dot(self.who, hidden_outputs)

# 최종 출력 계층에서 나가는 신호를 계산

final_outputs = self.activation_function(final_inputs)

return final_outputs

# 입력, 은닉, 출력 노드의 수

input_nodes = 784

hidden_nodes = 100

output_nodes = 10

 

# 학습률

learning_rate = 0.3

# 신경망의 인스턴스를 생성

n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

# mnist 학습 데이터인 csv 파일을 리스트로 불러오기

import csv

import urllib2

url = 'https://media.githubusercontent.com/media/freebz/Make-Your-Own-Neural-Network/master/mnist_dataset/mnist_train_100.csv'

response = urllib2.urlopen(url)

training_data_file = csv.reader(response)

training_data_list = list(training_data_file)

response.close()

 

# 신경망 학습시키기

# 주기(epoch)란 학습 데이터가 학습을 위해 사용되는 횟수를 의미

epochs = 5

 

for e in range(epochs):

# 학습 데이터 모음 내의 모든 레코드 탐색

for record in training_data_list:

all_values = record

# 입력 값의 범위와 값 조정

inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01

# 결과 값 생성 (실제 값인 0.99 외에는 모두 0.01)

targets = numpy.zeros(output_nodes) + 0.01

# all_values[0]은 이 레코드에 대한 결과 값

targets[int(all_values[0])] = 0.99

n.train(inputs, targets)

pass

pass

 

# mnist 테스트 데이터인 csv 파일을 리스트로 불러오기

url = 'https://media.githubusercontent.com/media/freebz/Make-Your-Own-Neural-Network/master/mnist_dataset/mnist_test_10.csv'

response1 = urllib2.urlopen(url)

test_data_file = csv.reader(response1)

test_data_list = list(test_data_file)

response1.close()

 

# 신경망 테스트하기

# 신경망의 성능의 지표가되는 성적표를 아무 값도 가지지 않도록 초기화

scorecard = []

 

# 테스트 데이터 모음 내의 모든 레코드 탐색

for record in test_data_list:

all_values = record

# 정답은 첫 번째 값

correct_label = int(all_values[0])

# 입력 값의 범위와 값 조정

inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01

# 신경망에 질의

outputs = n.query(inputs)

# 가장 높은 값의 인덱스는 레이블의 인덱스와 일치

label = numpy.argmax(outputs)

# 정답 또는 오답을 리스트에 추가

if (label == correct_label):

# 정답인 경우 성적표에 1을 더함

scorecard.append(1)

else:

# 정답이 아닌 경우 성적표에 0을 더함

scorecard.append(0)

pass

pass

 

# 정답의 비율인 성적을 계산해 출력

scorecard_array = numpy.asarray(scorecard)

print "performance = ", float(scorecard_array.sum()) / scorecard_array.size

performance = 0.6

 

위의 결과로부터 학습 데이터 100, 테스트 데이터 10개를 사용했을 때, 신경망의 정확도는 60%임을 확인할 수 있다. 학습 데이터의 수를 늘리게 되면, 이보다 더 높은 정확도를 기대할 수 있는데, 실제로 이 신경망을 60,000개의 학습 데이터에 의해 학습시키고, 10,000개의 테스트 데이터에 적용하면, (신경망의 가중치의 초기치가 임의로 주어지므로, 정확도의 수치가 일부 다를 수 있으나) 대략 95%의 정확도를 얻게 된다.

 

MNIST 데이터 셋의 손 글씨 숫자를 인식한 사례는 신경망을 학습시키기 위한 데이터가 충분히 확보되었기에 가능했다. 이전에는 사용할 수 있는 데이터가 많지 않았으나, 오늘의 세계에서는 매일 (quintillion) 바이트의 데이터가 생성된다고 알려져 있다. 인공지능 시스템이 많은 량의 학습 데이터를 이용하여 특징을 파악하게 되면, 좀 더 나은 결과를 추론할 수 있을 것이다.

 

MNIST 숫자 인식 사례와 마찬가지로, 음성 또는 신호를 인식하거나 문자를 인식하는 것도 유사한 방법으로 가능하다. 이보다 더 높은 수준의 분석이 요구되는 자연어 처리(Natural Language Processing, NLP)는 우리가 일상생활에서 사용하는 언어를 컴퓨터가 의미를 분석하여 처리하도록 하는 것으로, 단순히 음성 또는 문자를 인식하는 것 이외에 말하는 사람이 의미한 것, 필요한 것들을 추론을 해야 한다. 예를 들어, 사용자가 "피자 먹고 싶다!"라는 문장을 말했을 때, 인공지능 시스템은 음성의 파형으로부터 "피자 먹고 싶다!"라는 문장을 인식하는 것에서 더 나아가 사용자가 실제로 원하는 정보를 추론을 거쳐 파악하고 찾아서 제공해줘야 한다. 피자 예 ("피자 먹고 싶다!")에서 보면, 음식(food)으로 표기된 피자라는 용어의 사용에 주목하여, 말하는 사람이 피자를 만드는 방법을 알고 싶어 한다는 걸 암시하는 조리법과 같은 용어가 본문에 없음을 파악하고, 말하는 사람이 피자집을 찾고 있다고 판단할 수 있다. 이 경우 GPS 정보를 가지고 피자를 제공하는 식당을 찾아 근접성, 등급, 가격 순으로 순위를 매긴다. 만약 사용자가 이용한 피자 식당들의 기록이 있다면, 인공지능 시스템은 사용자가 자주 이용하는 식당 중 추천이 많은 가까운 곳을 찾아, 자연어 문장을 생성하여, 우리말로 다음과 같이 추천할 수도 있다.

 

"여기서 2km 정도 떨어진 곳에 ***라는 피자집이 있습니다."

 

 

[참고 문헌]

Bitna Kim and Young Ho Park, Beginner’s guide to neural networks for the MNIST dataset using MATLAB, Korean J. Math. 26 (2018), No. 2, pp. 337-348.

Bitna Kim, Handwritten digits classication by neural networks with small data, Master thesis, Kangwon National University, 2018.

타리크라시드 지음, 송교석 옮김, 신경망 첫걸음, 한빛미디어, 2017.

Kristian Hammond, Practical Artificial Intelligence for Dummies, John Wiley & Sons, 2015.

 

 

       


『인공지능을 위한 기초수학』은 모든 대학생을 대상으로 인공지능에 필요한 기초수학을 선별하여 한 학기 강의용으로 만든 강좌와 교재이다. 인공지능 이해에 필수적인 수학 콘텐츠인 선형대수학, 다변수 미적분학, 기초 통계와 확률, SVD, 주성분 분석(PCA) 및 그래디언트 알고리즘과 파이썬 및 R 코드 및 실습실을 포함하는 내용으로 구성한다. 본 강의는 처음부터 끝까지 인공지능(머신러닝)을 이해하는데 필요한 수학적 개념을 소개하는데 집중하고 있다. 먼저, 인공지능의 알고리즘을 이해하는 데 필요한 최소한의 수학 개념을 고교, 대학 수학 과정의 수준으로 설명하고, 이어서 배운 개념들이 실제로 인공지능을 개발할 때 어떻게 쓰이는지, 이어서 잘 알려진 예와 알고리즘을 이용하여 쉽게 설명한다.특히 수학적인 이론과 함께 수학적 풀이와 관련 파이썬(Python) 및 R 코드를 교재에 제공하고 마련된 클라우드 컴퓨팅 실습실을 활용하여, 어렵지 않게 복잡한 계산과 데이터 처리 및 시각화를 직접 하면서 학습할 수 있도록 한다.

 

<Pioneers of Korean Modern Mathematics>

http://matrix.skku.ac.kr/K-Math-History/index.htm


 

Copyright @ 2019 SKKU Matrix Lab. All rights reserved.
Made by Manager: Prof. Sang-Gu Lee with Dr. Jae Hwa Lee and Dr. Eungki Kim