알고리즘을 이해하기 어려운 이유는 컴퓨터가 이해하는 명령을 표현하기 위한 특별한 표기법을 사용하기 때문입니다. 알고리즘은 프로그래밍 언어와 독립적이므로 알고리즘을 구성하는 문장들을 표현하기 위해서는 별도의 표기법이 필요합니다.

혼자만 이해할 수 있는 방법으로 알고리즘을 나타내는 것도 방법 중 하나이지만, 기록해두었던 내용을 시간이 흐른 후 다시 보면 기억이 나지 않는 불상사가 일어날 수도 있습니다. 프로그래밍 경험이 쌓이면 알고리즘을 생각하면서 생각한 내용을 바로 프로그래밍 언어로 나타낼 수 있습니다. 하지만 프로그램을 처음 배울 때는 바로 효과가 나타나지 않습니다. 따라서 먼저 알고리즘을 표준화하는 방법을 이용하여 기술하고, 이를 프로그래밍 언어를 사용하여 구현하는 하향식으로 프로그램을 작성하는 것이 바람직합니다.

알고리즘을 나타내는 표준화된 방법에는 여러 가지가 있지만, 알고리즘은 궁극적으로 프로그래밍 언어로 표현되어야 하므로 알고리즘 표현 방법과 프로그래밍 언어는 떼려야 뗄 수 없는 관계에 있습니다. 일상적인 언어를 사용한 문장의 나열로 나타내는 방법도 알고리즘을 기술하는 방법 중 한 가지이며, 이를 '의사 코드(pseudo code)'라고 합니다. 하지만 프로그램을 염두에 둔 의사 코드는 일상적인 언어가 아니라 프로그래밍 언어에서 사용되는 간단한 영어 단어와 기호를 사용하여 컴퓨터가 이해할 수 있는 문장으로 알고리즘을 표현합니다.

 

 


 

 

현금 인출 흐름도

 

 

A와 B의 통화를 위한 흐름도

 

 

알고리즘을 표현하는 또 다른 방법은 문제 해결의 순서와 흐름을 약속된 기호로 이용하여 그림으로 나타내는 방법으로, 이를 흐름도(flowchart, 또는 순서도)라고 부릅니다. 흐름도는 영어 단어 대신 시각적인 기호를 사용하므로 알고리즘을 직관적으로 이해할 수 있다는 장점이 있습니다. 하지만 복잡한 알고리즘의 경우, 한 페이지 내에 알고리즘을 모두 표현할 수 없고, 그림으로 나타내기가 번거로운 단점도 있습니다. 이러한 단점으로 인해 최근 흐름도를 많이 사용하지는 않지만 프로그래밍을 처음 접하는 경우에는 흐름도가 의사 코드에 비해 알고리즘을 이해하고 작성하기에는 더 쉬운 방법입니다.

 


※ 오늘은 C언어 프로그래밍에서 '알고리즘을 이해하는 법'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #알고리즘이해 #흐름도 #flowchart #순서도 #의사코드

 

 

 

알고리즘은 컴퓨터 프로그램에만 관련된 것은 아니며, 일상적인 사람의 행동 역시 알고리즘으로 표현할 수 있습니다. 즉, 컴퓨터가 문제를 해결하는 방식뿐만 아니라 사람이 문제를 해결하는 방식 역시 알고리즘으로 표현할 수 있습니다. 알고리즘은 '간단하고도 엄밀히 정의된 방식'으로 표현되어야 합니다. 현금 인출기에서 5만 원을 인출하는 경우로 예를 들겠습니다.


 

 

[현금 인출 알고리즘]

1. 카드를 넣는다

2. 비밀번호 4자리를 입력한다

3. 만약 비밀번호가 틀렸다면 카드를 받고 1번부터 다시 시작한다

4. 서비스 항목 중에서 현금 지급을 선택한다

5. 5만 원을 입력한다

6. 현금과 카드, 그리고 명세표를 받는다.

한 번도 현금 인출기를 이용해지 보지 않은 사람에게 5만 원을 찾아오라고 하였을 때 현금 인출 알고리즘을

만들었다고 생각해봅시다. 간단하고 명확하게 현금을 인출하는 과정을 알려 주어야 실수 없이 현금 인출이라는 목적을 완수하고 되돌아올 수 있습니다.

 


 

[통화 알고리즘]

1. B에게 전화를 건다

2. 통화 중이면 전화를 끊고 [1단계로 돌아간다 / 다시 전화를 건다]

3. 전화가 연결되면 B를 찾는다

4. B가 전화를 받으면 장소를 말하고 [6단계로 넘어간다]

5. B가 전화를 받지 않으면 약속 장소를 메모로 남긴다.

6. 전화를 끊는다.

상황은 A가 B에게 약속을 정하기 위해 전화를 거는 것을 알고리즘화하였습니다. B와의 통화 알고리즘에서 첫 번째 단계인 'B에게 전화를 거는 부분'을 살펴보겠습니다. B에게 전화를 거는 방법은 쉽습니다.

전화기를 들고 B에게 바로 번호를 누르면 됩니다. 하지만 컴퓨터는 'B에게 전화를 거는 문장을 알아듣지 못합니다. 따라서 '전화기를 들고', 'B의 전화번호를 누르는' 단순한 문장의 나열로 명령을 내려야 합니다. 어쩌면 '전화기를 드는' 명령 자체도 컴퓨터에게 복잡한 명령일 수도 있습니다. '손을 전화기로 가져가서', '수화기를 잡고', '수화기를 들어 올리는' 여러 개의 문장들로 나누어 명령을 내려야 전화기를 들라는 명령을 이해할 수 있을지 모르며, 이보다도 단순한 명령으로 다시 나누어야 할지도 모릅니다.

 


※ 오늘은 C언어 프로그래밍에서 '일상생활에서 알고리즘 적용'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #일상생활에서의알고리즘 #알고리즘화

 

 

경제적, 정치적 결정을 내릴 때 시뮬레이션을 참고하는 경향은 오늘 날 점점 강화되고 있습니다. 현실에서 일어나는 과정을 컴퓨터에서 계산 하는 것인데 그 이유는 2가지가 있습니다.

 

 

첫째, 아직 일어난 적 없는 과정을 연구할 때 시뮬레이션이 쓰입니다. 날씨 예측이나 향후 100년 동안의 세계 기후 시뮬레이션들 일어나지 않은 과정들에 활용이 됩니다.

 

둘째, 현실에서 실험이 너무 번거롭거나 비용이 많이 들 때 시뮬레이션이 쓰입니다. 예컨데 현실에서자동차 충돌 실험을 하려면 매번 비싼 차체를 고철로 만들어야 합니다. 충돌 과정 전체를 컴퓨터에서 계산할 수 있다면 효율적으로 일을 해결할 수 있습니다.

 

하지만 위의 2가지 이유말고 의문점이 생깁니다. "여기서 말하는 시뮬레이션은 현실과 얼마나 유사할까?" 라는 질문을 할 수 있습니다. 왜냐하면 시뮬레이션은 엄연치 현실과는 오차범위가 있고 언제나 예외,변수등이 일어날 수 있습니다.

 

현실에서 마주치는 과정을 계산하려며 물리량들의 상호관계를 기술하는 '미분방정식'을 풀어야 합니다. 그런데 대개의 미분방정식 풀이는 완전한 해를 구하는 방식으로 이루어지지 않습니다. 대신에 사람들은 문제를 모든 점에서 고찰하지 않고 띄엄띄엄 떨어진 점들로 구성된 격자에서만 고찰함으로써 이산화 (discretize)합니다. 예를 들어 온도, 풍속 등을 모든 지점에서 계산하는 대신에 전체 지역을 1제곱 킬로미터 면적의 구역으로 나누고 각 구역에서의 값을 계산하는 것으로 만족해야 합니다.

 

일반적으로 그 격자가 촘촘할수록 미분방정식의 해는 현실과 더 유사하게 됩니다. 그러나 격자가 촘촘해지면 그만큼 계산에 공이 더 많이듭니다. 이를테면 3차원 공간에서 일어나는 한 현상을 시뮬레이션하는데, 격자의 눈의 한 변을 반으로 줄이면 계산에서 고려할 점들이 8배로 늘어나므로 계산 시간도 8배로 늘어나게 됩니다. 이 때문에 날씨 예측에서 격자를 점점 더 촘촘하게 만들다보면 내일 날씨의 계산 결과가 모래에야 나오는 상황이 발생할 수도 있습니다.

 

 

 

때로는 촘촘한 격자가 필요하지 않습니다. 예컨대 기체나 액체의 흐름을 고찰할 때는 그 흐름이 층류(laminar flow)여서 뒤엉킴 없이 매끄럽게 흐르기만 한다면 비교적 성긴 격자로도 좋은 계산 결과를얻을 수 있습니다. 반면에 난류(turbulent flow)에서는 아주 작은 소용돌이 하나도 흐름 전체에 중요한 영향을 미치므로 더 촘촘한 격자가 필요합니다.

 

이른바 '다중격자 알고리즘(multigrid algorithm)'의 원리는 1970년대 후반 이래로 개발되었습니다. 이 알고리즘은 고정된 격자를 사용하는 대신에 풀어야 할 미분 방정식을 고찰하여 어느 구역에서는 격자를 더 촘촘하게 만들어야 하고 어느 구역에서는 비교적 성긴 격자로도 충분한지 판단합니다. 이 알고리즘의 최대 장점은 계산의 복잡성을 줄여서 훨씬 더 빠른 계산을 가능케 하는 것에 있습니다.

 

다중격자 알고리즘은 최신 컴퓨터들의 계산 능력 향상에도 불구하고 그 능력을 아껴 쓰기 위한 노력이 앞으로도 늘 필요할 것임을 보여주는 한 사례입니다. 오늘날 사람들은 컴퓨터의 놀라운 성능을 대수롭지 않게 여기는 경우가 많습니다. 컴퓨터 내부에서 작동하는 알고리즘의 효율성을 높이기 위해서 수많은 노력과 인력이 들어갑니다.

 

 

#다중격자알고리즘 #multigridalgorithm

 

 

 

 

최초의 알고리즘으로 가장 오래된 알고리즘으로 자주 언급되는 것은 기원전 300년경에 만들어진 유클리드의 '최대공약수를 찾는 알고리즘'입니다. 최대 공약수는 2개 이상의 자연수의 공약수 중에서 가장 큰 수를 말합니다.

 

유클리드는 2개 자연수의 최대 공약수는 큰 수에서 작은 수를 뺀 수와 작은 수와의 최대 공약수와 같다는 성질을 이용하여 최대 공약수를 찾는 알고리즘을 만들었습니다.

예를 들어 24와 14의 최대 공약수는 큰 수에서 작은 수를 뺀 10(=24-14)과 14와의 최대공약수와 동일합니다. 단, 0과 어떤 수 n의 최대공약수는 n이 됩니다.

 

최대공약수 (24,14)

= 최대공약수 (24, -14, 14) = 최대공약수(10, 14)

= 최대공약수 (14, -10, 10) = 최대공약수(4, 10)

= 최대공약수 (10 - 4, 4) = 최대공약수(6, 4)

= 최대공약수 (6 - 4, 4) = 최대공약수(2, 4)

= 최대공약수 (4 - 2, 2) = 최대공약수(2, 2)

= 최대공약수 (2 - 2, 2) = 최대공약수(0, 2)

= 2


 

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #유클리드알고리즘 #최대공약수찾는알고리즘

 

 

스왑의 개념에 대해 직관적으로 이해했다면, 이제 금융시장에서 이루어지는 진짜 스왑거래에 대해 알아 보겠습니다.

 

금융시장에서 스왑거래의 기초자산은 주로 통화(Currency)와 이자율(Interest Rate)입니다. 그래서 스왑과 관련해 어디선가 통화스왑이나 이자율스왑 (또는 금리스왑) 이라는 용어를 들어본 적이 있을 것입니다. 2008년 글로벌 금융위기 당시 우리나라가 미국, 일본, 중국과 통화스왑을 체결했었는데, 이 것이 바로 국가 간 통화스왑의 대표적인 예입니다.

 


 

양국이 통화스왑을 통해 교환할 금액과 계약시간을 정함으로써 스왑 계약을 체결하는 것입니다. 당시 우리나라와 미국 간의 통화스왑 계약은 금융위기 등 필요시에 300억 달러 한도 내에서 한국의 원화와 미국의 달러를 교환한다는 조건이었습니다. 그리고 금액과 통화는 다르지만 이와 비슷한 스왑 계약을 통해 일본과 중국과도 거래를 체결했습니다.

 

통화스왑의 일반적인 거래 방식은 비교적 단순합니다. 통화스왑 거래 개시와 함께 거래 당사자 쌍방이 원금을 교환하고 (자신이 보유하고 있는 통화를 상대방이 보유하고 있는 통화의 교환), 거래기간 동안은 이자만 교환하다가 거래 종료와 함께 원금의 재교환이 이루어집니다.)

 

국내기업과 그 국내기업의 자회사인 미국법인이 미국 달러화에 대한 통화스왑 거래를 하면 어떤 상황이 벌어질까요?

 

일단 양자 간 통화스왑 계약은 100만 달러 규모이며, 계약기간은 3년, 환율은 달러당 1,000원, 이자율은 달러화가 2%, 원화가 4%라고 가정합니다. 통화스왑 거래 개시와 함께 양자는 달러화와 원화를 교환합니다.

 

즉, 국내기업은 미국법인에 10억 원 (100만 달러 * 1000원)을 주고, 미국법인으로부터 100만 달러를 수령합니다. 그리고, 각 통화에 대한 이자로 상호간 매년 4,000만원 (10억원 * 4%)과 2만 달러(100만 달러 * 2%)를 교환합니다. 3년 후 원금과 함께 마지막 해 이자를 교환 (국내기업은 미국법인에 102만 달러를 주고, 미국법인으로부터 10억 4,000만원을 받음)함으로써 통화스왑 거래는 종료가 되는 것입니다.

 


 

반면 이자율 스왑은 이자율을 교환하는 거래입니다.

 

예를 들면 변동금리와 고정금리를 서로 맞바꾸는 것입니다. 이자율 스왑거래를 위해서는 동일한 통화라는 전제조건이 있어야 합니다. 통화는 교환되지 않고 이자율만 교환되기 떄문입니다. 그리고 교환의 대상이 되는 이자율은 주로 장기고정금리와 단기변동금리가 있습니다.

 

예를 들자면, A라는 은행이 개인고객에게 코픽스(Copix) 변동금리로 아파트 담보대출을 판매했는데, 이자율 리스크 때문에 고정금리로 바꾸고자 한다고 가정을 해봅시다. 이런 경우, 담보대출을 받은 고객들에게 고정금리대출로 전환하라고 강제할 수 없는 노릇입니다. 이런 상황에서 B라는 은행이 단기자금 운용을 위해 변동금리를 선호한다고 하면, A 은행과 B 은행은 이자율 스왑을 통해 서로의 편익을 증대시킬 수 있습니다.

 


 

 

#컴퓨터공학 #금융공학 #데이터사이언스 #금융공부 #금융수학 #스왑 #파생금융상품

 

'컴퓨터공학 #금융공학 #데이터사이언스 #금융공학이란무엇인가? #금융공부 #파생상품' 태그의 글 목록

 

studyenthusiast-26.tistory.com

 

 

 

 

흔히 스왑(Swap)이라고 하면, 바꾼다는 의미를 떠올릴 수 있습니다.

 

스왑이라는 파생금융상품은 말 그대로 무언가를 교환하는 거래계약을 말합니다. 교환하는 이유는 , 즉 스왑을 하는 이유는 다른 파생상품들과 마찬가지로 미래의 불확실성과 리스크를 최소화하기 위해서 입니다. (특히나 스왑에서의 불확실성 및 리스크 최소화는 중요합니다.)

 

스왑이 일반적인 교환과 다른 점은 잠시 교환한다는 것입니다. 당사자 간 합의하에 각 당사자가 가지고 있는 것을 서로 잠시 교환해서 바꿔 쓴다고 생각하면 됩니다. 예를 들자면, 수학 참고서를 가지고 있는 철수와 영어 참고서를 가지고 있는 영희가 1개월이라는 기간 동안 서로의 참고서를 교환해서 공부한 후 1개월 후에 다시 되돌려주기로 했다면, 이 또한 스왑 계약에 해당이 되는 것입니다.

 

영어를 잘하는 직원을 데리고 있는 부서와 중국어를 잘하는 직원을 데리고 있는 부서가 상호 합의하에 6개월 동안 해당 직원들을 서로 교환해 파견근무를 시키고 6개월 후에는 다시 원래 소속 부서로 복귀시키는 계약을 맺었다면, 이 또한 스왑계약이라고 할 수 있습니다.

 

이와 같이 스왑은 실생활에서 많이 접할 수 있는 거래유형이기도 합니다. 그리고 위의 예제에서 볼 수 있듯이, 스왑 계약이 성사되기 위해서는 양 당사자가 서로 스왑을 필요로 해야합니다. 스왑거래라는 교환행위를 통해 모든 스왑 계약 당사자들의 리스크는 감소하고 편익 (benefit)은 커져야 한다는 것입니다. 곰곰이 생각해보면 일상생활에서 벌어지는 거의 모든 교환행위가 바로 이 스왑거래와 상당히 유사하다는 점을 알 수 있습니다.

 

 

#컴퓨터공학 #금융공학 #데이터사이언스 #금융공부 #금융수학 #스왑 #파생금융상품

 

 

'컴퓨터공학 #금융공학 #데이터사이언스 #금융공학이란무엇인가? #금융공부 #파생상품' 태그의 글 목록

 

studyenthusiast-26.tistory.com

 

 

 

 

 

※ 프로그램 = 알고리즘 + 프로그래밍 언어

 

 

프로그램은 시스템에서 디지털 데이터 처리를 담당하는 부분으로, 컴퓨터를 사용하면 인간이 상상할 수 있는 모든 작업을 할 수 있습니다.

프로그램은 C와 같은 프로그래밍 언어로, 작성된 코드를 직접 타이핑하여 만드는 것이 아닙니다.

 

프로그래밍 언어는 수행하고자 하는 작업을 구체화시키는 도구일 뿐입니다.

 

여기서 중요한 점은 문제를 푸는 것은 결국 컴퓨터가 아니라 사람입니다. 사람이 해결할 수 없는 문제는 컴퓨터 또한 해결하기 어렵습니다.


 

프로그램을 만들기 위해서는 '알고리즘'과 '프로그래밍 언어'가 필요합니다.

 

프로그램= 주어진 문제를 해결하기 위해 컴퓨터에서 주어지는 일련의 명령어 집합

컴퓨터는 사람의 말을 이해하지 못하므로 컴퓨터에게 명령을 내리기 위해서는 컴퓨터가 알아들을 수 있는 말이 필요합니다. 컴퓨터에게 명령(복잡한 것)을 내리기 위해서는, 여러 개의 문장이 필요하며, 문장들은 주어진 문제를 해결할 수 있도록 논리적으로 배열되어야 합니다.

'알고리즘'은 문장을 배열하여 내용을 조리 있게 표현하는 방법과 관련되어 있고, '프로그래밍 언어'는 사용할 수 있는

단어와 단어를 사용하여 문장을 구성하는 방법과 관련되어 있습니다. C 언어를 이용하여 두 숫자를 더하고 그 합을 출력하는 코드에서 단어와 문장 그리고 알고리즘을 나타내는 과정을 아래에서 확인할 수 있습니다.

 

 

 

 

 

프로그램은 알고리즘프로그래밍 언어로 이루어져 있습니다. 프로그램을 만드는 법을 배우기 위한 효과적인 학습방법은 하향식으로 배우는 것입니다.

'하향식'이란 큰 문제를 여러 개의 작은 문제로 나눈 후 작은 문제들을 해결함으로써 결국에 큰 문제로 해결하는 방식을 뜻합니다.

프로그램을 작성하는 과정에서는 문장들을 조합하여 주어진 문제를 해결할 수 있는 알고리즘 작성 방법을 먼저 배우고, 개별 문장을 프로그래밍 언어를 사용하여 나타내는 방법을 나중에 배우는 것이 하향식에 해당됩니다. 알고리즘이 프로그래밍을 먼저 무조건 하는 것보다 중요합니다.

우리는 흔히 프로그래밍 언어를 배우는 것만으로도 컴퓨터에 명령을 내리고 주어진 문제를 해결할 수 있다고 생각합니다. 프로그래밍 언어를 배우면 컴퓨터가 이해할 수 있는 몇 종류의 문장을 만드는 방법을 배울 수 있지만, 프로그램은 수십 혹은 수백 개의 문장으로 구성되며, 매우 복잡한 프로그램은 수만 개의 문장으로도 구성이 됩니다.

예를 들어 드론을 설계, 조립 사용 설명서를 만든다고 가정을 합니다. 한글만을 배워서 간단한 문장을 쓰는 중학생이 이 설명서를 말로 설명하거나 작성을 할 수 있을까요? 이와 마찬가지로 컴퓨터가 알아들을 수 있는 문장 작성 방법을 배우고, 문장들을 논리적으로 나열하기 위해서는 컴퓨터에 관련된 지식이 필요합니다. 더불어 컴퓨터에게 주어진 문제를 해결하도록 명령을 내리고 싶다면, 먼저 컴퓨터가 문제를 해결하는 방식에 맞는 알고리즘을 만들어야 하고, 알고리즘을 실제로 구현하기 위해 프로그래밍 언어가 필요합니다.

프로그래밍 언어는 문제를 해결해 주지 않으며, 알고리즘을 구현하는 도구일 뿐입니다. 실제로 문제를 해결하는 것은 알고리즘입니다. 알고리즘을 만든 후 이를 구현할 때는 어떤 프로그래밍 언어를 사용해도 괜찮습니다.


 

알고리즘은 프로그래밍 언어와 독립적이며, 컴퓨터가 문제를 풀어 나가는 방식에 맞게 문제 해결 방식을 기술한 것을 말합니다. 사람이 문제를 해결하는 방식과 컴퓨터가 문제를 해결하는 방식은 달라 보이고, 실제로도 다릅니다. 하지만 컴퓨터를 만드는 것은 사람이기 때문에 컴퓨터가 문제를 해결하는 방식이 사람이 문제를 해결하는 방식과 전혀 다르지 않습니다. 다만, 컴퓨터는 생각보다 단순하기 때문에 이해할 수 있는 내용이 그리 많지 않으므로 사람이 생각하는 방식 중 가장 간단한 방식으로만 문제를 풀어나갈 수 있습니다. 또한 컴퓨터는 융통성이 없기 때문에 문제를 풀어 나갈 때 모호한 점이 있어서는 안 됩니다.

 

 

컴퓨터의 문제 해결 방식과 절차를 배우는 것이 바로 알고리즘 학습 방식입니다.

 

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어

#공대공부 #하향식문제해결

 

 

회귀는 연속적인 숫자(Continuous Number) 변수들 강의 상관관계를 파악하는 것으로, 특히 종속변수와 독립변수(Independent Variable) 사이의 연관성을 분석하는 것을 주된 목적으로 합니다. 회귀에 대한 이해를 돕기 위해 주택가격에 대한 한 가지 예를 들어 보겠습니다.

살고 있는 집을 팔고 싶은데 도대체 얼마를 받아야 하는지를 알고 싶다고 가정합니다. 그런데 팔려는 집과 동일한 크기의 주택은 사례가 없어서 주택가격을 얼마로 결정해야 하는지 애매하다면 다른 크기의 주택가격 데이터와 회귀 분석을 통해 합리적인 주택가격을 산정할 수 있습니다.

회귀분석을 시작할 때 가장 먼저 해야 할 일은 데이터의 상관정도를 직관적으로 파악하게 종속변수와 독립변수의 산점도(Scatter Plot)를 그리는 것입니다.

 


 

 

주택 크기와 가격 산점도

 

위의 그림에서도 알 수 있듯이 주택가격과 크기는 일정한 관계, 즉 선형적인 관계가 있음을 쉽게 파악할 수 있습니다. 해결하고 싶은 문제는 크기에 따른 주택가격인데, 산점도를 보면 크기가 클수록 가격이 높아지는 선형적인 관계가 있으므로 다음과 같은 모델(수식)을 떠올릴 수 있습니다.

 

 

Y = aX  + b

 

 

Y는 주택가격으로 '종속변수'라 하고, X는 크기로 '독립변수'라고 합니다. 가정한 모델이 1차 함수이므로 'a'는 기울기, 'b'는 절편을 의미하고 있습니다. 주어진 데이터를 이용해 a 값과 b값을 찾게 된다면 주택 가격 결정을 위한 모델을 완성할 수 있고, 완성된 모델의 X에 팔려는 집의 크기를 입력하면 주택가격을 알 수 있습니다. 프로그램을 이용해 a의 값이 0.65, b의 값이 0.89일 때 앞서 보았던 산점도를 가장 잘 표현할 수 있다면 '주택가격 = 0.65 X 크기 + 0.89라는 관계가 성립한다고 할 수 있습니다.

이제 주택가격과 크기의 관계를 알았으니 크기만 알면 앞의 식에 넣어 적절한 주택가격이 얼마인지를 산정할 수 있게 됩니다.

 

 

 

회귀 분석

 


 

이처럼 주어진 변수 간의 상관관계를 파악하는 것이 회귀입니다. 회귀의 문제의 예는 다음과 같습니다.

1. 과거의 온도 데이터를 이용해 내일 온도를 예측합니다.

2. 주식시세 정보를 이용해 미래의 주식가격을 예측합니다.

3. 유동인구, 날씨, 가격정보 등을 이용해 음식점의 매출을 예측합니다.

4. 구매자의 나이와 연 소득을 이용하여 특정 제품의 판매량을 예측합니다.

 


 

※ 오늘은 '회귀(Regression)'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

#인공지능 #컴퓨터공학 #AI #머신러닝 #Machinelearning #데이터사이언스 #Datascience #회귀 #Regression

 

 

자동차 자율주행, 고양이 사진인식, 이미지 자막 넣기 (Image Captioning)등 최근 머신러닝이 보여주는 엄청난 성과를 보면 머신러닝이 고도의 수학적 배경과 정교한 알고리즘으로 무장해 내가 원하는 많은 문제를 해결할 것으로 믿을 수도 있습니다. 하지만 아직까지 머신러닝이라는 마법으로 해결할 수 없는 문제가 많지 않으며, 그마저도 엄청난 노력과 시간을 대가로 요구합니다.

머신러닝을 적용해 무언가에 대한 결과를 얻는 것은 생각보다 많은 시간이 필요합니다. 하나의 완성물을 얻으려면 수십 번, 수백 번 반복을 통해 조금씩 개선해가고, 때에 따라서 모델을 새롭게 만들거나 전혀 새로운 시각으로 접근해야 합니다. 더욱 머신러닝으로 특정문제를 해결하려면 그 특정 문제를 머신러닝에 적합한 형태로 바꿔야 원하는 결과를 얻을 수 있습니다. 따라서 머신러닝을 제대로 활용하려면 머신러닝이 잘 할 수 있는 것과 그렇지 않은 것을 아는 것이 중요합니다.

스팸메일을 필터링하고, 글자와 음성을 인식하는 머신러닝을 보면 다양한 일을 처리할 수 있을 것이라 생각하겠지만, 크게 3 가지 종류의 일을 처리할 수 있습니다. 변수 간의 관계를 파악하는 회귀(Regression), 데이터를 분류하는 분류(Classificaiton), 데이터를 연관있는 것끼리 묶어주는 군집화(Clustering)이 있습니다.

머신러닝은 이 3 가지를 이용해 다양한 문제를 해결합니다. 회귀와 분류는 모든 머신러닝 알고리즘의기본이 되는 중요한 개념입니다.

 


 

※ 오늘은 '머신러닝이 할 수 있는 것'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

1956년 미국 뉴 햄프셔 주에 있는 다트머스 대학에서 개최된 다트머스 회의에서 'Artificial Intelligence' (인공지능)이라는 용어가 처음 제창되었습니다. 그 회의의 멤버였던 존 매커시가 제안했던 용어입니다.

 

 

존 매커시

 

매커시는 '인공지능의 아버지'라고 불리는 컴퓨터 과학자입니다. 그 밖에 인공지능이란 용어는 아니지만, 동일한 개념은 1947년 '컴퓨터 과학의 아버지'라고 불리는 앨런 튜링에 의해 제안 되었습니다.

 


 

※ 오늘은 'AI라는 이름을 지은 사람​'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

머신러닝은 학습방법에 따라 크게 3가지 종류로 나뉠수 있습니다.

 

사람이 입력과 출력을 모두 제공하는 지도학습(Supervised Learning), 입력만 제공하는 비지도학습(Unsupervised Learning), 어떤 환경에서 특정목표를 달성하기 위해서 스스로 학습하는 강화학습(Reinforcement Learning)입니다.

 

 

 

 

현시점에서 활용빈도로 보면 지도학습이 가장 많고, 그 다음이 비지도학습, 마지막은 강화학습이 되겠습니다.

 


 

 

1) 지도학습 (Supervised Learning)

 

- 지도학습은 가장 많이 활용되는 머신러닝의 종류로 스팸메일 필터링, OCR 문자 인식 등이 이에 해당됩니다. 지도학습은 머신러닝에 입,출력을 모두 제공하여 학습하게 하는 거승로, 일종의 최적 (Optimization) 문제로도 생각을 할 수 있습니다. 이는 지도학습 알고리즘이 주어진 입력값을 분석해 출력값을 만들어내기 위한 최적의 모델을 만들기 때문입니다. 예를 들어, 고양이의 이미지를 구분할 수 있는 머신러닝 프로그램을 개발한다고 가정을 합니다. 지도학습은 입력과 출력을 모두 제공해야 하므로 고양이 사진과 함께 고양이라는 것을 알려주어야 합니다. 고양이가 있는 사진에 '고양이'라는 출력 결과도 같이 제공해야 합니다.

 

따라서 지도학습에서는 하나의 데이터는 입력과 출력이 같이 묶여있는 튜플(Tuple)형태로 이루어집니다.

 

 

 

2) 비지도학습 (Unsupervised Learning)

 

- 위에서 설명한 지도학습이 입력을 분석해 출력을 만들어내는 최적화 문제라면 비지도 학습은 입력 데이터의 구조를 파악하거나 관계를 분석하는 방법이라고 할 수 있습니다. 비지도 학습은 '지식 발견 (Knowledge Discovery)'라고도 하는데, 이는 학습결과로 생각하지 못한 지식을 발견하거나 입력 데이터 간의 그룹 또는 특성 들을 발견할 수 있어서입니다.

지도학습과 구분되는 또 하나의 특징은 학습결과에 대한 평가가 힘들다는 점이 있습니다. 이는 학습결과가 명확한 목적, 즉 출력이 없어서 평가기준을 잡을 수 없기 때문입니다. 지도학습에서 데이터를 제공할 때 하나의 데이터마다 입력과 출력이 튜플로 제공되지만, 비지도 학습에서는 출력 없이 입력만 제공됩니다.

 

 

앞의 지도학습에서는 고양이 사진과 이름이 주어졌지만, 다음 그림처럼 비지도학습에서는 이름 없이 고양이 사진만으로 학습이 이루어집니다.

 


 

※ 오늘은 '머신러닝의 종류'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

 

머신러닝에 대한 개념이나 각종 성공사례를 처음 접하면 머신러닝이 마치 천하의 보검처럼 느껴져 어떠한 문제라도 머신러닝으로 해결할 수 있을 것 같은 느낌을 받습니다. 그리고 예제로 제공되는 코드들을 실행해보면 그리 길지 않은 코드로 신기하게 그림에서 문자를 인식하고 아이리스 꽃의 종류를 분별하는 등, 기존 프로그래밍 방법으로는 막막한 것들을 너무도 쉽게 해내 놀랍기 그지없습니다.

하지만 머신러닝은 한 번 휘두르면 모든 적을 제압할 수 있는 천하의 보검이 아니라는 것을 분명히 알고, 역시 예제는 예제라는 만고의 진리를 깨닫게 되는 데는 그리 오랜 시간이 걸리지 않을 것입니다. 이러한 결과는 머신러닝에 사용한 데이터가 잘못되었거나 엉뚱한 알고리즘을 적용하였거나 머신러닝에 적합하지 않은 문제 때문에 벌어졌을 가능성이 큽니다.

머신러닝을 제대로 사용하려면 머신러닝의 장단점을 파악해 해결하려는 문제가 머신러닝에 적합한 것인지, 적합하지 않은 것이라면 어떻게 문제를 재정의해야 하는지, 어떤 데이터를 사용해야 하는지 등을 고민해봐야 할 것입니다.

 

 

 


 

 

 

※ 머신러닝의 장점

1) 학습을 위해 지식 표현이 필요 없습니다. 컴퓨터가 지식을 이해하게 하기 위한 표현은 어려운 문제입니다.

2) 충분한 데이터와 적합한 알고리즘을 사용한다면 사람이 만든 모델보다 좋은 결과를 보여줄 수 있습니다.

3) 고도의 수학적 지식이나 프로그래밍 능력을 요구하지 않습니다. 기본적인 지식과 능력으로도 충분히 머신러닝을 이용할 수 있습니다.

4) 자동화가 가능합니다. 프로그램으로 머신러닝을 학습시키고 최적의 파라미터를 찾아 그 결과에 대한 평가 등을 자동화하여 진행할 수 있습니다.

5) 저렴하고 유연합니다. 데이터를 제외한 나머지 과정은 자동화가 가능하므로 저렴하게 실행할 수 있습니다.

6) 프로그램을 이용해 자신이 원하는 대로 사용할 수 있습니다.

 

 

※ 머신러닝의 단점

1) 데이터 준비에 많은 노력이 들어갑니다. 지도학습(Supervised Learning)의 경우 모든 개별 데이터에 결과치를 만들어 주어야 합니다.

2)오류 발생이 쉽습니다(Error Prone). 일반적으로 정확도가 높은 모델을 만들기가 어렵습니다.

3) 생성된 모델이 블랙박스(Black Box)이기 때문에 이를 해석하기 어렵습니다. 정확도를 높이려면 모델을 수정하거나 개선할 수 있어야 하는데, 대부분의 머신러닝 알고리즘은 학습결과로 생성된 모델을 이해하기 어렵고 모델 자체를 개선할 수 없습니다.

4) 과적합(Overfitting) 문제가 종종 발생합니다. 주어진 데이터에 너무 최적화되어 학습에 사용된 데이터는 높은 예측력(Predictive Power)을 보여주지만, 그렇지 않은 데이터에는 좋지 않은 예측력을 보여줍니다.

 


 

※ 오늘은 '머신러닝의 장.단점'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

 

#인공지능 #컴퓨터공학 #AI #머신러닝 #Machinelearning #머신러닝의장단점 #데이터사이언스 #Datascience

+ Recent posts