경사법에서는 기울기(경사) 값을 기준으로 나아갈 방향을 정합니다. 기울기란 무엇인지, 또 어떤 성질이 있는지를 설명하기에 앞서, 이번 절에서는 학생 때 배운 '미분'부터 복습해 보겠습니다.
4.3.1 미분
여러분이 마라톤 선수고 처음부터 10분에 2km씩 달렸다고 해봅시다. 이때의 속도는 간단히 2/10 = 0.2[km/분]이라고 계산할 수 있습니다. 즉, 1분에 0.2km만큼의 속도(변화)로 뛰었다고 해석할 수 있습니다.
이 마라톤 예에서 '달린거리'가 '시간'에 대해서 얼마나 변화했는가를 계산했습니다. 다만 여러기에서 10분에 2km를 뛰었다는 것은, 정확하게는 10분 동안의 '평균 속도'를 구한 것이죠. 미분은 '특정 순간'의 변화량을 뜻합니다. 그래서 10분이라는 시간을 가능한 한 줄여 (직전 1분에 달린거리, 진전 1초에 달린 거리, 진전 0.1초에 달린 거리,....식으로 갈수로 간견을 줄여)한 순간의 변화량(어느 순간의 속도)을 얻는 것이죠.
이처럼 미분은 한순간의 변화량을 표시한 것입니다. 수식으로 다음과 같습니다.
좌변은 f(x)의 x에 대한 미분(x에 대한 f(x)의 변화량)을 나타내는 기호입니다. 결국, x의 '작은 변화'가 함수f(x)를 얼마나 변화시키느냐를 의미합니다. 이때 시간의 작은 변화, 즉 시간을 뜻하는 h를 한없이 에 가깝게 한다는 의미를 lim로 나타납니다.
4.3.2 수치 미분의 예
앞 절의 수치 미분을 사용하여 간단한 함수를 미분해 봅시다. 우선 다음과 같은 2차 함수입니다.
y = 0.01x2 + 0.1x
파이썬으로 구현하면 다음과 같이 됩니다.
def function_1(x):
return 0.01*x**2+0.1+x
2018년 2월 6일 화요일
1.1 벡터와 공간
그럼 바로 벡터부터 시작합니다. 어떤 분야에서라도 '몇 개의 수치를 한 곳에 모아 한 덩어리로 다루고 싶다'라고 생각할 것입니다. 예를 들어 센서 열 개를 탑재한 로봇이라면 거기에서 얻을 수 있는 관측치 열 개를 한 덩어리로 다루고 싶을 것입니다.
1.1.1 우선적인 정의: 수치의 조합을 정리하여 나타내는 기법
수를 나열한 것을 벡터라고부릅니다. 예를 들면 다음과 같습니다.
성분수를 명시하고 싶을 때는 각각 2차원 벡터, 3차원 벡터, 5차원 벡터라고 부릅니다. 벡터라고 하면 특별히 미리 말하지 않는 한 이처럼 세로로 늘어선 '종벡터'라고 약속합니다. (2,3,5,8)처럼 가로로 늘어선 '횡벡터'도 있지만, 이 책에서는 종벡터를 기본으로 합니다. 단 종벡터를 정말로 세로로 표기하면 공간만 차지하므로 다음과 같이 표기하겠습니다.
(2,3,5,8)T
T는 전치를 뜻하는 Transpose의 T입니다.
1.1 왜 그렇게 종벡터를 좋아하나요?
'변수 x에 함수 f를 적용하다'라는 작업을 일반적으로 f(x)라고 씁니다. 이와 같은 어순으로 '벡터 x에 행렬 A(로 나타내지는 함수)를 적용하다'라는 작업을 행렬의 곱으로 Ax라 쓰기 위해서 입니다 (1.2.1절). 만약 x가 횡벡터라3.면 xA처럼 '대상 -> 작업'이라는 어순이 되어 버립니다. 단, 객체지향에 익숙한 사람에게는 f(x)보다는 x.f쪽이 자연스러울지도 모르겠습니다.
1.2 '수'란?
이 책에서는 '실수'또는 '복소수'로 읽어주세요. 실수인지 복소수인지에 따라 이야기가 달라지는 경우에는 정확히 명시해두었습니다. 또한, 성분이 실수인 것을 명시하지 않았다면 '실벡터'나 '실행렬'로 부르고, 성분이 복소수인 것을 명시하지 않았다면 '복소벡터'나 '복소행렬'로 부릅니다. 만약을 대비해 용어를 확인해 둡시다.
자연수 0, 1, 2, 3,.....
정수 ...., -2, -1, 0, 1, 2,.....
유리수 (정수)/(정수)로 표현되는 수
실 수 3.14159265....처럼 (무한)소수로 표현되는 수
복소수 허수 단위 i(i2 = -1)를 사용하여 (실수) + (실수)i로 표현되는 수
i라는 기호는 허수 단위 이외에 단순한 변수명으로 사용됩니다. 물론 문맥상 분명하므로 햇갈릴까 걱정하지 않아도 됩니다.
'데이터 구조'를 정의했으면 그에 대한 연산도 정의합시다. 벡터의 덧셈과 정수배를 다음과 같이 정의합니다.
덧셈 같은 차원의 벡터에 대해
정수배 임의의 수 c 에 대해
덧붙여서 말하자면 횡벡터의 덧셈과 정수배도 똑같이 정의합니다.
벡터는 x,v,e 처럼 두꺼운 글씨로 쓴다고 약속합니다. 그냥 숫자와 벡터를 확실히 구별하고 의식하도록 습관을 들이기 위해서 입니다. 스스로 노트에 정리할 때도 생략하지 말고 x,v,e 처럼 꼭 두꺼운 글자로 쓰도록 합니다. 특히 영벡터(모든 성분이 0인 벡터)를 o = (0, 0, ....0)T라는 기호로 씁니다. 또한, (-1)x 는 -x로 줄여 쓰고, x + (-y) 를 x -y라고 줄여 씁니다. 2x + 3y라고 쓰면 (2x) + (3y)처럼 정수배를 먼저 계산 합니다.
수 c, c'와 벡터 x,y에 대한 다음과 같은 성질은 '한분에' 알 수 있을 것입니다.
1.1.2 '공간'의이미지
2차원 벡터는 모눈종이 위에 점으로 찍을 수 있습니다(그림 1-1), (3,5)T 라면 '가로축 3, 세로축 5'의 위치에, (-2.2, 1.5)T라면 '가로축 -2.2, 세로축 1.5'의 위치에, 영벡터 o=(0,0)는 원점 0과 같은 상태입니다. 이와 같이 3차원 벡터도 3차원 공간 안 어딘가에 한 점으로 나타낼 수 있습니다.
이런 식으로위치에 대응시키는 것을 강조할 때는 '위치 벡터'라고 부르기도합니다.
위치라는 해석 외에 원점 0에서 그 위치를 향하는 '화살표'라는 해석도 있습니다. 덧셈과 정수배를 도형으로 해석하려면 화살표 쪽이 더 잘 어울립니다. 덧셈은 화살표의어어 붙임, 정수배는 길이를 늘이고 줄입니다(그림 1-2). '-3배'라면, 물론 '반대 방향으로 원래 길이의 3배'가 됩니다.
1.5 일차원 벡터란 그냥 숫자인가요?
일차원 벡터(a)와 수 a를 동일시하는 것은 자연스러운 현상이라고 생각합니다. 둘 모두 직선상의 한 점으로 나타나니까요. 단, 단위를 취하는 벙법에 따라 값이 변하는 것에는 주의합시다. 다음 절에서 설명할 '기저'와 관련된 문제입니다. 1.11, 1.20도 참고하세요. 또한, 대부분의 프로그래밍 언어에서는 '크기 1인 배열'과 '수치'는 다른 것이므로 명시적인 변환 작업이 필요할 것입니다.
1.1.3 기저
우주에는 위도 없고 오른쪽도 없다
앞 절에서 2차원 벡터를 평면 위의 점이라고 해석했습니다. 앞에서는 평면에 모눈종이 눈금이 그려져 있었습니다만, 본래 우주에는 위라든지 오른쪽이라든지 특별한 방향이란 게 없을 것입니다. 여기서 마음껏 눈금을 지워봅시다.
눈금도 특별한 방향도 없는 오로지 평평한 평면입니다. 표식이 되는 것은 원점 o하나뿐입니다. 처음에는 조금 불안하지만, 이런 세계에서도 잘 해나갈 수 있습니다. 즉, '덧셈'도 '정수배'도, '화살표 해석'을 하면 수행 기능 합니다. 없어도 해나갈 수 있는 것은 없는 채로 생각하는 것이 스마트하지요. 이처럼 '덧셈'과 '정수배'가 정의된 세계를 선형 공각이라 부릅니다. 벡터 공간이라고 부르는 사람도 있습니다.
이 스마트한 세계에서의벡터는 화살표 해석을 강종하여 x, y, e처럼 표기합니다. 숫자의나열로서의 벡터는 x, 화살표로서의 벡터는 x 로 구분해서 쓰는 것은 이 책에서만 사용하는 약속입니다.
선형 공간은 우리가 사는 현실 공간의 어느 측면을 어느 수준에서 추상화한 것입니다. 완전한 복제가 아닌 '기능 축소판'이므로 오해하지 말아 주십시오. 이 세계에서는 영벡터만 특별하고, 그 외에는 어느 화살표도 대등합니다. 적용되는 것은 덧셈과 정수배뿐입니다. 뭐든지 직선형입니다.
여기서 이 세계에는 '길이'나 '각도'가 정의되지 있지 않다는 것에 주의해 주십시오. 다른 방향의 벡터끼리 대소를 비교하는 방법은 없습니다. '회전(=길이를 유지하며 방향을 바꾸다)'이라는 작업도 정의할 수 없습니다. '본래의' 선형 공간에 이런 기능은 없습니다.
기준을 정하며 번지를 매기자
자, 스마트해진 것은 좃습니다만, 이 상태로는 특정 벡터 v를 지정하는데 '여기'라고 손가락으로 가리킬 수 밖에 없습니다. 역시 조금 불편합니다. 말로도 의치를 전할 수 ㅣㅇㅆ도록 이 세계에서 '번지(좌표)'를 매겨 줍시다.
우선 기준이 되는 벡터 e1, e2가 무엇인지 정합니다. 예를 들어 그림 1-4처럼요, 기준을 정하면 e1를 3보 e2를 2보'처럼 말하여 벡터 v의 위치를 지정할 수 있습니다.
즉, 다음과 같이 말하는 것입니다.
v = 3e1 + 2e2
이런 '기준이 되는 한 쌍의 벡터'를 기저, '각 기준에서 몇 보 나아가는가'를 좌표라고 합니다. 위의 예라면 '기저(e1, e2) 에 대한 벡터 v=(3,2)T입니다., 또한, '기저'라고하면 팀( e1, e2)를 말하며, 팀의 멤버인 e1나 e2는 기저 벡터라고 부릅니다.
기준을 잡는 방법은 여러 가지로 생각할 수 있습니다. 특히 그림 1-5 처럼 잡으면 제일 처음에 생성한 모눈종이 눈금과일치하네요.
단, 벡터를 몇 개쯤 가져와서 묶는 다고 뭐든 기저가 되는 것은 아닙니다. 다음 절에서는 기저라고 부를 수 있는 자격에 대해 이야기 하겠습니다.
1.1.4 기저가 되기 위한 조건
벡터의 조합을 기저라 부르는 것은 다음 두 가지 조건을 만족시켰을 때뿐입니다.
1. (지금 생각하고있는 공간 안의) 어떤 벡터 v라도 라는 형태로 나타낼 수 있다.
2. 게다가 나타내는 방법은 한 가지뿐이다.
조건 1은 당연한 요청입니다. 좌표로 이야기하고 싶은데 나타낼 수 없는 것이 있으면 고란합니다.
조건2도 성가심을 피하기 위해서 꼭 요청하고 싶은 부분입니다. 그렇지 않으면 곤란합니다.
1.1.6 좌표에서의 표현
사실 좌표에'기저'를 지정하지 않으면 의미가 없습니다. 이는 당영한 것으로 "후지산의 높이는 3776이다"라고 하면 무슨 뜻인지 알 수 없습니다. "3776m다"라고 단위를 붙이고 나서야 의미를 지니는 것과 같습니다. 이때 값'3776'이 좌표, 단위'm'가 기저에 해당합니다.
그렇다고 해도 매번 기저를 쓰는 것은 귀찮고 위압적인 느낌이 듭니다. 다음 절 이후부터는 기저를 생략하고 좌표 v만 표시하도록 하니다. 어떤 기저를 정하여 계속 고정시키 두므로 일일이 쓰지 않는 다는 입장입니다. 평소에는 좌표 v를 '벡터'라고 생각해도 상관없습니다만, 마음에 여유가 생겼을 때는 배후에 있는 기저를 의힉하고 봐 주십시오.
좌표만으로 이야기하려면 "덧셈과 정수배를 좌표로 말하면 어찌되는가"를 확인해 두어야 합니다. 결과는 별 것 없어서 "어떤 기저를 취하여 좌표를 표시해도 덧셈과 정수배는 식(1.1)과 식 (1.2)처럼 좌표 성분마다 덧셈과 정수배가 된다"입니다. 실제로 벡터 과 수 에 대해 다음 내용을 바로 확인 할 수 있습니다.
또한, 두 가지 이상의 기저가 등장하는 경우도 가끔 있습니다. 이 경우에도 물론 기저를 명시합니다. 두 기정에 대해 한 쪽의 좌표에서 다른 쪽의 좌표를 구하는 '좌표 변화' 이야기는 '행렬'을 도입한 후 1.2.11절에 설명합니다.
1.2 행렬과 사상
벡터라는 '대상'을 알았으니 다음 관심읔 대상 간의 '관계'입니다. 이 관계를 나타내기 위해 행렬이 등장합니다.
1.2.1 우선적인 정의: 순수한 관계를 나타내는 편리한 기법
수를 직사각형 형태로 나열한 것을 행렬이라고 부릅니다.
크기를 명시하고 싶은 경우에는 각각 2*2 행렬, 2*3행렬, 5*3 행렬처럼 부릅니다. '행렬'이므로 '행'과 '열'의 순으로 표기한다고 기억해 주십시오. 특히 행 수와 열 수가 같은 행렬을 정방행렬이라고 부릅니다. 크기를 명시하고 싶은 경우는 2*2 또는 2차 정방행렬, 3*3 또는 3차 정방행렬이라 부릅니다.
행렬 A의 i행과 j열의 값을 A의(i,j)성분이라고 합니다. 예를 덜어 앞에서 제시한 세 행렬 중 중아의 행렬에서 (2,1) 성분은 \sqrt{7}\ 이고, (1,3) 성분은 1/7입니다. (i, j) 성분이라 할 때의 순서도 '행', '열'입니다. 또한 다음과같이 쓸때 첨자 순서도 일반적으로 '행','열'입니다.
귀찮아서 이를 '3*4 행렬 A=(aij)'등으로 줄여 쓰는 경우도 있습니다. 일반적으로 행렬은 알파벳 대문자로, 성분은 소문자로 씁니다.
행렬의 덧셈과 정수배를 다음과 같이 정의합니다.
덧셈같은 크기의 행렬에 대해
정수배 임의의 수 c에 대해
다음과 같은 표기법 약속은 벡터의 경우와 같습니다.
또한, 행렬과 벡터의 곱을 정의하겠습니다. 그 전에 잠시 다음과 같은 산수 문제를 생각해 주십시오.
고기를 x그램, 콩을 x그램, 쌀을 x그램 샀습니다. 합계는 얼마일까요? 또한, 총 몇 칼로리일까요?
각각의 답인 y(돈), y(칼)은 다음과 같습니다.
y(돈) = a(돈고)x(고) + a(돈콩)x(콩) + a(돈쌀)x(쌀)
y(칼) = a(칼고)x(고) + a(칼콩)x(콩) + a(칼쌀)x(쌀)
식에서 a(돈고)는 고기 1그램당 가격, a(칼고)는 고기 1그램당 칼로리입니다.
이 식들을 정리하면 다음과 같이 쓸 수 있습니다.
'요인'인 x(고),x(콩),x(쌀)과 '요소'인 a가 각각 하나에 정리되어 깔끔하게 보기 좋아집니다. 이것이 '행렬과 벡터의 곱'입니다.
곱 m*n행렬과 n차원 벡터에 대해
곱에 대해서는 다음 사항을 주의합니다.
- 행렬과 벡터의 곱은 벡터
- 행렬의 열 수(가로폭)가 '입력'의 차원 수, 행 수(높이)가 '출력'의 차원 수
- 입력의 종벡터를 가로로 넘겨 딱딱 계산하는 느낌
자, 식(1.5)와 식(1.6)을 다시 새겨둡시다. 이 식들이 나타내는 것은 요인 x(고), x(콩), x(쌀)에서 결과 y(돈), y(칼)이 결정될 때 상승 효과(세트 할인)나 규모에 의한 변화(대량 매수 할인)등이 없는 '순수'한 관계입니다. 그 덕분에 a(돈고)x(고) + a(돈콩)x(콩) + a(돈쌀)x(쌀)과 같은 형태의 식은 다루기 쉽고, 예측하기도 좋아 깔끔하게 노의할 수 있습니다. 이 '순수함'을 멋있게 바꿔 말하면 "정의한 '벡터의 덧셈과 정수배'를 제대로 유지하다"라고 표현됩니다. 이는 행렬 A에 대해 ' x + y = z 에서 Ax+ Ay= Az' , 'cx = y에서 c(Ax) = Ay'라는 의미입니다.
정리하면 행렬이란 순수한 관곌르 나타내는 편리한 기법입니다.
1,15 행렬이 '순수한 관계'라는 것을 알았습니다. 반대로 '순순한 관계'는 모두 행렬이라 생각해도 될까요?
일반ㄴ적으로 f(x + y) = f(x) + f(y), f(cx) = cf(x)라는 성질을 지닌 사상 f를 선형 사상이라고 합니다(x, y는 같은 크기의 벡터, c는 수, f(x)의 값은 벡터라고 합니다). 즉, 본문을 고쳐 말하면 '행렬 A를 곱한다는 사상은 선형 사상이다'라는 것입니다. 그 반대로 말할 수 있어서 임의의 선형 사상f는 '행렬을 곱한다'는 형태로 반드시 쓸 수 있습니다. 실제로 e1 = (1,0,0,0,....,0)T, e2=(0,1,0,0,....,0)T.....를 각각 입력한 때의 출력을 ai = f(ei) 로 두면 입력 x=(x1, ...,xn)T에 대한 출력은 f(x) = x1a1+....+xnan이 됩니다. 종벡터 a1, ....an을 나열한 행렬 A = (a1, a2,....,an)를 사용하면 이것은 f(x)= Ax로 쓸 수 있습니다(1.2.9절 '블록행렬'). 멋있게 말하면 행렬이란 '선형 사상을 좌표 성분으로 표시한 것'입니다.
1.2.2 여러 가지 관계를 행렬로 나타내다(1)
앞 절에서 설명했듯이 "행렬을 곱하다"는 순수한 관계'를 나타냅니다. "상승 효과나 규모 효과가 없고, 단순히 가 요인의 합계다'라는 순수한 관계는 여기저기서 맞딱드리게 됩니다. 대상 자체가 곧은 경우도 있고, 복잡한 것에 대한 근사 모델로 가정된 경우로 있는 것은 0.2절 '근사 수단으로 사용하기 편리하다'에 서술한 대로입니다.
학 거북이 계산
학이 x(학)마리, 거북이가 x(거북)마리 있다면 머리의 개수 y(머리)와 다리의 개수 y(다리)는 다음과 같습니다.
y(머리) = a(학머리)x(학) + a(거북머리)x(거북) = x(학) + x(거북)
y(다리) = a(학다리)x(학) + a(거북다리)x(거북) = 2x(학) + 4x(거북)
a(학머리)=1 은 학 한 마리의 머리 개수, a(거북다리) = 4는 거북이 한 머리의 다리 개수라는 형태 입니다. 이를 행렬로 쓰면 다음과같습니다.
이것도 상승 효과나 규모 효과가 없는 순수한 관꼐네요. 학 열 마리의 다리 개수는 학 한 마리의 다리 개수를 단순히 10배하면 됩니다. 집단 A와 집단B를 합쳐 놓은 머리의 총 개수는 A의 머리 개수와 B의 머리 개수를 단순히 더하면 됩니다.
제품과 필요 원료
다음과같은 예도 생각할 수 있습니다.
- 제품 1을 한개 만드는 데는 원료 1, 2, 3이 각각 a11, a21, a31 그램씩 필요
- 제품 2을 한개 만드는 데는 원료 1, 2, 3 이 각각 a12, a22, a32 그램씩 필요
지금 제품 1,2를 각각 x1, x2개 만든다면 원료 1,2,3의 필요량 y1,y2,y3은 다음과 같이 구할 수 있습니다.
그 외 여러 가지
그 외에도 다양한 경우에서 y = Ax 형태의 관계를 만나게 됩니다. 자세히 설명하려면 각 분야의 전문 지식이 필요하므로 여기서는 예만 들어 보겠습니다. 다음과 같은 것이 있습니다.
- 회로망 이론( LCR 회로의 전류와 전압)
- 신호 처리(선형 필터, 푸리에 변환, 웨이블릿 변환)
- 제어 이론(선형 시스템)
- 통계 분석(선형 모델)
y= Ax라는 형태로 노골적으로 쓰진 않아도 그렇게 해석 가능한 경우도 있습니다.
1.2.3 행렬은 사상이다.
n차원 벡터 x에 m*n 행렬 A를 곱하면 m차원 벡터 y = Ax가 얻어집니다. 즉, 행렬A를 지정하면 벡터를 다른 벡터에 옮기는 사상이 결정됩니다. 사실 이것이야말로 행렬의 가장 중요한 기능입니다. 지금부터는 행렬을 보면 단순히 '수가 나열되어 있다'라고 생각하지 말고, '사상이 주어졌다'고 생각해 주십시오. 계속해서 강조하겠습니다.
행렬은 사상이다.
사상이라는 언어는 조금 위압감이 있을지도 모릅니다. 일반적으로 쓰이는 '변환'이란 말도 있지만, 수학용어로서의 변환에는 '대등한 것에 이동한다'라는 의미가 있습니다. n차원 공간에서 m차원 공간이라는 다른 세계에 옮기는 것을 변환이라고 부를 수 없으므로 사상이라는 조금 더 넓은 언어를 사용했습니다.
자, 이 설명만으로는 아직 '점을 점으로옮긴다'는 이미지겠지요. 여기서 조금 더 힘을 내 '공간 전체가 어떻게 변하는 가'를 떠올릴 수 있다면 선형대수가 매우 알기 쉬워질 것입니다. '백문이 불여일견, 이 장에서는 이 변형을 애니메이션 프로그램으로 실제로 관찰해 봅시다.
1.2.4 행렬의 곱 = 사상의 합성
행렬끼리의 곱을 다음과 같이 정의 합니다.
곱 k*m 행렬 B = (bij)와 m*n 행렬 A = (ajp)에 대해
각 행렬의 크기에 주의합니다. k * m 행렬의 곱이 k * n 입니다.
계산은 다음 방법을 추천합니다.
1. 오른쪽 행렬을 세로 단락으로 분해한다.
2. 분해한 각각에 왼쪽 행렬을 곱한다(행렬과 벡터의 곱으로서).
3. 결과를 접착
구체적으로는 다음과 같은 요령입니다.
처음 보면 "이건 뭐야"라는 반응이 보통입니다. 이는 '사상의 합성'을 나타냅니다. 벡터 x를 우선 사상 A로 날려버리고, 목적한 곳 y = Ax역시 사상 B 로 날렸다고 합시다. 최종 종착지는 z = B(Ax) 입니다. 여기서 행렬의 곱 BA는 x를 z에 단숨에 날리는 사상인 것입니다.
요약하면 'A하고, B한다'가 곱 BA인 것입니다. 식으로 쓰면 다음과 같습니다.
(BA)x = B(Ax)
어떠한 x에도 성립합니다. 일단 이해가 되면 같은 것을 굳이 구별할 필요가 없으므로 보통은 괄호를 생략하고 BAx처럼 씁니다. (BA)x로 해석해도, B(Ax)로 해석해도 답은 같습니다.
이 '의미'와 '계산법'의 관계는 그림 1-13을 보면서 이미지화 해보세요. B의 폭(열수)과 A의 높이(행 수)가 맞지않으면 안되는 것도 이 그림을 보고 이해할 수 있을 것입니다.
1.17 A하고, B한다면 AB가 아닌가요?
'f한 것을 g한다'는 g(f(x))이지요, 옐르 들어 '대문자로 출력한다'라면 putchar(toupper(x))입니다. 이와 같은 의미로 BAx가 정답입니다. 이 스타일로 쓰는 한 조각 순서와 표기 순서가 반대인 것은 어쩔 수 없습니다.
다음으로 세 행렬 A, B, C의 곱도 생각해 봅시다. 예상대로 'A하고, B하고, C하는 것은 CBA'입니다. 여기서 포인트는 다음 어느 것이어도 결과가 같다는 것입니다.
- 'A하고, B한다'를 하고 나서 C를 한다.
- A를 하고 나서 'B하고, C한다'를 한다.
식으로 쓰면 다음과 같습니다.
C(BA) = (CB)A
마찬가지로 행렬이 네 개인 경우를 봅시다.
D(C(BA)) = D((CB)A) = (D(CB))A = (DC)(BA)
이렇게 괄호를 붙여도 결국 같습니다. 그러므로 보통은 괄호 따위 붙이지 않고 CB
A 나 DCBA처럼 씁니다.
그러나 BA와 AB는 같지 않습니다. 우선 A,B의 크기에 따라 처음부터 곱이 정의되지 않습니다.
또한, 만약 가능해도 결과는 대부분 다릅니다.
사실 행렬 A는 공간을 '돌린다', 행렬 B는 공간을 '가로로 넓히다'라는 효과가 있습니다. A와 B의 곱은 BA라면 돌려서 가로로 늘리고, AB라면 가로로 넓혀서 돌리는 것이 됩니다. 결과는 서로 다릅니다.
1.18 곱의 정의식(1.9)의 어디를 어떻게 보면 '이것은 사상의 합성이다' 라고 알 수 있나요?
행렬의 각 열은 각 축 방향의 단위 벡터 e1, .... em의 목적지가 된다는 지적을 우선 떠올려주세요(1.2.3절 '행렬은 사상이다'). 지금 'A하고, B한다'에 대응하는 행렬을 C라고 합시다. C의 1열인 c1을 알기 위해서는 e1 = (1,0,,,,,0)T가 C에서 어디로 갈지를 알아보면 됩니다. 즉, e1에 A를 고하여 거기에 더욱이 B를 곱한 어느 곳에 가는가 입니다.
1스텝의 Ae1은 물론 A의 1열a1이 됩니다. 그러므포 2스텝의 목적지는 c1 = Ba1입니다. 다른 것도 같으므로 C의 i열 ai에 B를 곱한 것디 됩니다. 다시 말해서 C=BA를 구하기 위해서는 행렬과 벡터의 곱 Ba1, ,,,, Bam을 계산해 두고, 그 결과를 나열하여 붙이면 됩니다. 이것은 좀 전에 서술한 '암기법' 그 자체입니다. 그러므로 '곱은 사상의 합성이다'라고 할 수 있습니다. 1.2.9절에서는 '열벡터'라는 언어를 사용하여 같은 내용을 한번 더 확인합니다.
1.2.5 행렬 연산의 성질
기본적인 성질
수 c, c', 벡터 x, 행렬 A, B, C에 대해 다음 성질이 성립합니다. 벡터나 행렬의 크기는 연산되도록 설정했습니다.
- (cA)x = c(Ax) = A(cx)
- (A + B)x = Ax + Bx
- A + B = B + A
- (A + B) + C = A + (B + C)
- (c + c')A = cA + c'A
- (cc')A = c(c'A)
- A(B + C) = AB + AC
- (A + B)C = AC + BC
- (cA)B = c(AB) = A(cB)
벡터도 행렬의 일종?
이미 잠깐 설명했듯이 n차원 벡터를 n * 1행려로 간주하여 덧셈, 정수배, 곱을 계산해도 결과는 같습니다.
1.2.6 행렬의 거듭제곱 = 사상의 반복
숫자에서와 같은 방식으로 정방행렬 A에 대해 다음과 같이 씁니다(정방이 아니면 처음부터 곱 AA가 정의되지 않습니다(크기가 맞지 않습니다.)).
사상으로 A2은 'A하고 한층 더 A한다', A3은 'A하고 A하고 A한다', An은 'A를 n번 반복 적용한다' 입니다. 거듭제곱은 가감승제보다도 먼저 계산하는 규칙입니다.
1.2.7 영행렬, 단위행렬, 대각행렬
특별한 행렬에는 이름을 붙여 둡시다.
- 영행렬
모든 성분이 0인 행렬을 영행렬이라 하고, 기호 O로 나타냅니다. 크기를 명시하고 싶을 때는 m*n 영행렬 Omn이나 n차 정방영행렬 On처럼 쓰기도 합니다.
영행렬이 나타내는 사상은 모든 것을 원점으로 이동시키는 사상입니다. 임의의 벡터 x에 대해 Ox = o이기 때문입니다.
- 단위행렬
정방행렬에서 대각선 위만 1이고 다른 것은 0인 행렬을 단위행렬이라고 하고, 기호 I로 나타냅니다. 크기를 명시하고 싶을때는 n차 단위행렬 In처럼 쓰기도 합니다.
'모든 성분이 1인 행렬'은 아니므로 주의합시다. 사상으로서의 의미를 보면 이해될 것입니다. 단위행렬이 나타내는 사상은 '아무것도 하지 않는' 사상입니다. 임의의 백터 x에 대해 Ix = x이므로 x를 원래 x 그래도 이동한다는 것을 알 수 있습니다. ㄱ
- 대각행렬
정방행렬의 대각선상의 값을 대각성분이라고 합니다.
대각성분 이외의 값은 비대각성분이라고 합니다.
비 대각성분이 모두 0인 행렬을 대각행렬이라 부릅니다.
거의 대부분 0인데 지면을 소비하면 아까우므로 다음과 같이 줄여서 씁니다. diag는 diagonal(대각선)의 줄임말입니다.
대각행렬이 나타내는 사상은 '축에 따르는 신축(늘고 줄음)이고, 대각성분이 각 축의 늘고 주는 배율이 됩니다. 따라서 대각성분 여하에 따라 공간이 변하는 모습도 다릅니다.
1.2.8 역행렬 = 역사상
다음은 A에 이동시킨 것을 원래대로 돌려 놓은 이야기입니다. 이 이야기는 2장에서 설명할 '결과에서 원인을 구한다'라는 주제와도 관련이 있습니다.
정의
정방행렬 A에 대해 그 역사상에 대응하는 행렬을 'A의 역행렬'이라고 하고, 기소 A-1이라 씁니다. 어떠한 x를 가져와도 'Ax = y 또는 A-1y = x'이고, 반대로 어떠한 y를 가져와도 A-1y = x또는 Ax =y'가 되는, 그런 행렬 A-1입니다. 대략 '이동점 y를 갖고 원래의 점 x를 구하다'라는 사상에 대응하는 행렬이 A-1입니다.
다르게 표현하면 A하고 A-1하면 원래대로 돌아가고, A-1하고 A해도 원래대로 돌아갑니다. 즉 다음과 같습니다.
A-1A = AA-1 = I
역행렬은 있을 수도, 없을 수도 있습니다. 직관적으로 말하면 '납작하게 눌리는' 경우는 역행렬이 존재하지 않습니다. 왜냐하면, '눌린다'는 것은 '서로 다른 두 점 x, x'가 A를 적용하면 같은 점 y = Ax = Ax'로 이동한다'라는 것이기 때문입니다. 그렇게 되면 '이동점이y'라고 주어져도 원래가 x였는지 x'였는지 구별이 안 됩니다. 즉, '이동점y를 들고 원래의 점 x를 답하는 사상'이라 만들수가 없습니다.
1.2.9 블록행렬
'큰 문제를 작은 부분 문제로 분할하는 것'은 복잡합에 대처하는 수단으로 효과가 있습니다. 행렬 연산에도 실은 그런 분할이 가능합니다.
정의와 성질
행렬의 종횡에 단락을 넣어 각 구역을 작은 행렬로 간주한 것을 블록행렬이라고 합니다.
쉬운 선형대수 책에는 그다지 실리지 않는 소재입니다만, 응용할 때 자주 사용하는 테크닉이므로 설명해 두겠습니다.
크기가 같은 블록 행렬 A=(Aij)와 B=(Bij), 수 c에 대해 다음 성질이 성립합니다.
행벡터, 열벡테
블록행렬의 특별한 경우로 다음과같이 한 방향으로만 작게 나누는 것도 생각해 볼 수 있습니다.
단락지어진 각 단편의 크기가 n*1이나 1*n'이므로 각 단락을 벡터라고 간주하는 것도 가능합니다. 그런 이유로 위 행렬처럼 나타났을 때 a1, a2...am을 'A의 열벡터'라고 하고,
1.1.1 우선적인 정의: 수치의 조합을 정리하여 나타내는 기법
수를 나열한 것을 벡터라고부릅니다. 예를 들면 다음과 같습니다.
성분수를 명시하고 싶을 때는 각각 2차원 벡터, 3차원 벡터, 5차원 벡터라고 부릅니다. 벡터라고 하면 특별히 미리 말하지 않는 한 이처럼 세로로 늘어선 '종벡터'라고 약속합니다. (2,3,5,8)처럼 가로로 늘어선 '횡벡터'도 있지만, 이 책에서는 종벡터를 기본으로 합니다. 단 종벡터를 정말로 세로로 표기하면 공간만 차지하므로 다음과 같이 표기하겠습니다.
(2,3,5,8)T
T는 전치를 뜻하는 Transpose의 T입니다.
1.1 왜 그렇게 종벡터를 좋아하나요?
'변수 x에 함수 f를 적용하다'라는 작업을 일반적으로 f(x)라고 씁니다. 이와 같은 어순으로 '벡터 x에 행렬 A(로 나타내지는 함수)를 적용하다'라는 작업을 행렬의 곱으로 Ax라 쓰기 위해서 입니다 (1.2.1절). 만약 x가 횡벡터라3.면 xA처럼 '대상 -> 작업'이라는 어순이 되어 버립니다. 단, 객체지향에 익숙한 사람에게는 f(x)보다는 x.f쪽이 자연스러울지도 모르겠습니다.
1.2 '수'란?
이 책에서는 '실수'또는 '복소수'로 읽어주세요. 실수인지 복소수인지에 따라 이야기가 달라지는 경우에는 정확히 명시해두었습니다. 또한, 성분이 실수인 것을 명시하지 않았다면 '실벡터'나 '실행렬'로 부르고, 성분이 복소수인 것을 명시하지 않았다면 '복소벡터'나 '복소행렬'로 부릅니다. 만약을 대비해 용어를 확인해 둡시다.
자연수 0, 1, 2, 3,.....
정수 ...., -2, -1, 0, 1, 2,.....
유리수 (정수)/(정수)로 표현되는 수
실 수 3.14159265....처럼 (무한)소수로 표현되는 수
복소수 허수 단위 i(i2 = -1)를 사용하여 (실수) + (실수)i로 표현되는 수
i라는 기호는 허수 단위 이외에 단순한 변수명으로 사용됩니다. 물론 문맥상 분명하므로 햇갈릴까 걱정하지 않아도 됩니다.
'데이터 구조'를 정의했으면 그에 대한 연산도 정의합시다. 벡터의 덧셈과 정수배를 다음과 같이 정의합니다.
덧셈 같은 차원의 벡터에 대해
정수배 임의의 수 c 에 대해
덧붙여서 말하자면 횡벡터의 덧셈과 정수배도 똑같이 정의합니다.
벡터는 x,v,e 처럼 두꺼운 글씨로 쓴다고 약속합니다. 그냥 숫자와 벡터를 확실히 구별하고 의식하도록 습관을 들이기 위해서 입니다. 스스로 노트에 정리할 때도 생략하지 말고 x,v,e 처럼 꼭 두꺼운 글자로 쓰도록 합니다. 특히 영벡터(모든 성분이 0인 벡터)를 o = (0, 0, ....0)T라는 기호로 씁니다. 또한, (-1)x 는 -x로 줄여 쓰고, x + (-y) 를 x -y라고 줄여 씁니다. 2x + 3y라고 쓰면 (2x) + (3y)처럼 정수배를 먼저 계산 합니다.
수 c, c'와 벡터 x,y에 대한 다음과 같은 성질은 '한분에' 알 수 있을 것입니다.
1.1.2 '공간'의이미지
2차원 벡터는 모눈종이 위에 점으로 찍을 수 있습니다(그림 1-1), (3,5)T 라면 '가로축 3, 세로축 5'의 위치에, (-2.2, 1.5)T라면 '가로축 -2.2, 세로축 1.5'의 위치에, 영벡터 o=(0,0)는 원점 0과 같은 상태입니다. 이와 같이 3차원 벡터도 3차원 공간 안 어딘가에 한 점으로 나타낼 수 있습니다.
이런 식으로위치에 대응시키는 것을 강조할 때는 '위치 벡터'라고 부르기도합니다.
위치라는 해석 외에 원점 0에서 그 위치를 향하는 '화살표'라는 해석도 있습니다. 덧셈과 정수배를 도형으로 해석하려면 화살표 쪽이 더 잘 어울립니다. 덧셈은 화살표의어어 붙임, 정수배는 길이를 늘이고 줄입니다(그림 1-2). '-3배'라면, 물론 '반대 방향으로 원래 길이의 3배'가 됩니다.
1.5 일차원 벡터란 그냥 숫자인가요?
일차원 벡터(a)와 수 a를 동일시하는 것은 자연스러운 현상이라고 생각합니다. 둘 모두 직선상의 한 점으로 나타나니까요. 단, 단위를 취하는 벙법에 따라 값이 변하는 것에는 주의합시다. 다음 절에서 설명할 '기저'와 관련된 문제입니다. 1.11, 1.20도 참고하세요. 또한, 대부분의 프로그래밍 언어에서는 '크기 1인 배열'과 '수치'는 다른 것이므로 명시적인 변환 작업이 필요할 것입니다.
1.1.3 기저
우주에는 위도 없고 오른쪽도 없다
앞 절에서 2차원 벡터를 평면 위의 점이라고 해석했습니다. 앞에서는 평면에 모눈종이 눈금이 그려져 있었습니다만, 본래 우주에는 위라든지 오른쪽이라든지 특별한 방향이란 게 없을 것입니다. 여기서 마음껏 눈금을 지워봅시다.
눈금도 특별한 방향도 없는 오로지 평평한 평면입니다. 표식이 되는 것은 원점 o하나뿐입니다. 처음에는 조금 불안하지만, 이런 세계에서도 잘 해나갈 수 있습니다. 즉, '덧셈'도 '정수배'도, '화살표 해석'을 하면 수행 기능 합니다. 없어도 해나갈 수 있는 것은 없는 채로 생각하는 것이 스마트하지요. 이처럼 '덧셈'과 '정수배'가 정의된 세계를 선형 공각이라 부릅니다. 벡터 공간이라고 부르는 사람도 있습니다.
이 스마트한 세계에서의벡터는 화살표 해석을 강종하여 x, y, e처럼 표기합니다. 숫자의나열로서의 벡터는 x, 화살표로서의 벡터는 x 로 구분해서 쓰는 것은 이 책에서만 사용하는 약속입니다.
선형 공간은 우리가 사는 현실 공간의 어느 측면을 어느 수준에서 추상화한 것입니다. 완전한 복제가 아닌 '기능 축소판'이므로 오해하지 말아 주십시오. 이 세계에서는 영벡터만 특별하고, 그 외에는 어느 화살표도 대등합니다. 적용되는 것은 덧셈과 정수배뿐입니다. 뭐든지 직선형입니다.
여기서 이 세계에는 '길이'나 '각도'가 정의되지 있지 않다는 것에 주의해 주십시오. 다른 방향의 벡터끼리 대소를 비교하는 방법은 없습니다. '회전(=길이를 유지하며 방향을 바꾸다)'이라는 작업도 정의할 수 없습니다. '본래의' 선형 공간에 이런 기능은 없습니다.
기준을 정하며 번지를 매기자
자, 스마트해진 것은 좃습니다만, 이 상태로는 특정 벡터 v를 지정하는데 '여기'라고 손가락으로 가리킬 수 밖에 없습니다. 역시 조금 불편합니다. 말로도 의치를 전할 수 ㅣㅇㅆ도록 이 세계에서 '번지(좌표)'를 매겨 줍시다.
우선 기준이 되는 벡터 e1, e2가 무엇인지 정합니다. 예를 들어 그림 1-4처럼요, 기준을 정하면 e1를 3보 e2를 2보'처럼 말하여 벡터 v의 위치를 지정할 수 있습니다.
즉, 다음과 같이 말하는 것입니다.
v = 3e1 + 2e2
이런 '기준이 되는 한 쌍의 벡터'를 기저, '각 기준에서 몇 보 나아가는가'를 좌표라고 합니다. 위의 예라면 '기저(e1, e2) 에 대한 벡터 v=(3,2)T입니다., 또한, '기저'라고하면 팀( e1, e2)를 말하며, 팀의 멤버인 e1나 e2는 기저 벡터라고 부릅니다.
기준을 잡는 방법은 여러 가지로 생각할 수 있습니다. 특히 그림 1-5 처럼 잡으면 제일 처음에 생성한 모눈종이 눈금과일치하네요.
단, 벡터를 몇 개쯤 가져와서 묶는 다고 뭐든 기저가 되는 것은 아닙니다. 다음 절에서는 기저라고 부를 수 있는 자격에 대해 이야기 하겠습니다.
1.1.4 기저가 되기 위한 조건
벡터의 조합을 기저라 부르는 것은 다음 두 가지 조건을 만족시켰을 때뿐입니다.
1. (지금 생각하고있는 공간 안의) 어떤 벡터 v라도 라는 형태로 나타낼 수 있다.
2. 게다가 나타내는 방법은 한 가지뿐이다.
조건 1은 당연한 요청입니다. 좌표로 이야기하고 싶은데 나타낼 수 없는 것이 있으면 고란합니다.
조건2도 성가심을 피하기 위해서 꼭 요청하고 싶은 부분입니다. 그렇지 않으면 곤란합니다.
1.1.6 좌표에서의 표현
사실 좌표에'기저'를 지정하지 않으면 의미가 없습니다. 이는 당영한 것으로 "후지산의 높이는 3776이다"라고 하면 무슨 뜻인지 알 수 없습니다. "3776m다"라고 단위를 붙이고 나서야 의미를 지니는 것과 같습니다. 이때 값'3776'이 좌표, 단위'm'가 기저에 해당합니다.
그렇다고 해도 매번 기저를 쓰는 것은 귀찮고 위압적인 느낌이 듭니다. 다음 절 이후부터는 기저를 생략하고 좌표 v만 표시하도록 하니다. 어떤 기저를 정하여 계속 고정시키 두므로 일일이 쓰지 않는 다는 입장입니다. 평소에는 좌표 v를 '벡터'라고 생각해도 상관없습니다만, 마음에 여유가 생겼을 때는 배후에 있는 기저를 의힉하고 봐 주십시오.
좌표만으로 이야기하려면 "덧셈과 정수배를 좌표로 말하면 어찌되는가"를 확인해 두어야 합니다. 결과는 별 것 없어서 "어떤 기저를 취하여 좌표를 표시해도 덧셈과 정수배는 식(1.1)과 식 (1.2)처럼 좌표 성분마다 덧셈과 정수배가 된다"입니다. 실제로 벡터 과 수 에 대해 다음 내용을 바로 확인 할 수 있습니다.
또한, 두 가지 이상의 기저가 등장하는 경우도 가끔 있습니다. 이 경우에도 물론 기저를 명시합니다. 두 기정에 대해 한 쪽의 좌표에서 다른 쪽의 좌표를 구하는 '좌표 변화' 이야기는 '행렬'을 도입한 후 1.2.11절에 설명합니다.
1.2 행렬과 사상
벡터라는 '대상'을 알았으니 다음 관심읔 대상 간의 '관계'입니다. 이 관계를 나타내기 위해 행렬이 등장합니다.
1.2.1 우선적인 정의: 순수한 관계를 나타내는 편리한 기법
수를 직사각형 형태로 나열한 것을 행렬이라고 부릅니다.
크기를 명시하고 싶은 경우에는 각각 2*2 행렬, 2*3행렬, 5*3 행렬처럼 부릅니다. '행렬'이므로 '행'과 '열'의 순으로 표기한다고 기억해 주십시오. 특히 행 수와 열 수가 같은 행렬을 정방행렬이라고 부릅니다. 크기를 명시하고 싶은 경우는 2*2 또는 2차 정방행렬, 3*3 또는 3차 정방행렬이라 부릅니다.
행렬 A의 i행과 j열의 값을 A의(i,j)성분이라고 합니다. 예를 덜어 앞에서 제시한 세 행렬 중 중아의 행렬에서 (2,1) 성분은 \sqrt{7}\ 이고, (1,3) 성분은 1/7입니다. (i, j) 성분이라 할 때의 순서도 '행', '열'입니다. 또한 다음과같이 쓸때 첨자 순서도 일반적으로 '행','열'입니다.
귀찮아서 이를 '3*4 행렬 A=(aij)'등으로 줄여 쓰는 경우도 있습니다. 일반적으로 행렬은 알파벳 대문자로, 성분은 소문자로 씁니다.
행렬의 덧셈과 정수배를 다음과 같이 정의합니다.
덧셈같은 크기의 행렬에 대해
정수배 임의의 수 c에 대해
다음과 같은 표기법 약속은 벡터의 경우와 같습니다.
또한, 행렬과 벡터의 곱을 정의하겠습니다. 그 전에 잠시 다음과 같은 산수 문제를 생각해 주십시오.
고기를 x그램, 콩을 x그램, 쌀을 x그램 샀습니다. 합계는 얼마일까요? 또한, 총 몇 칼로리일까요?
각각의 답인 y(돈), y(칼)은 다음과 같습니다.
y(돈) = a(돈고)x(고) + a(돈콩)x(콩) + a(돈쌀)x(쌀)
y(칼) = a(칼고)x(고) + a(칼콩)x(콩) + a(칼쌀)x(쌀)
식에서 a(돈고)는 고기 1그램당 가격, a(칼고)는 고기 1그램당 칼로리입니다.
이 식들을 정리하면 다음과 같이 쓸 수 있습니다.
'요인'인 x(고),x(콩),x(쌀)과 '요소'인 a가 각각 하나에 정리되어 깔끔하게 보기 좋아집니다. 이것이 '행렬과 벡터의 곱'입니다.
곱 m*n행렬과 n차원 벡터에 대해
곱에 대해서는 다음 사항을 주의합니다.
- 행렬과 벡터의 곱은 벡터
- 행렬의 열 수(가로폭)가 '입력'의 차원 수, 행 수(높이)가 '출력'의 차원 수
- 입력의 종벡터를 가로로 넘겨 딱딱 계산하는 느낌
자, 식(1.5)와 식(1.6)을 다시 새겨둡시다. 이 식들이 나타내는 것은 요인 x(고), x(콩), x(쌀)에서 결과 y(돈), y(칼)이 결정될 때 상승 효과(세트 할인)나 규모에 의한 변화(대량 매수 할인)등이 없는 '순수'한 관계입니다. 그 덕분에 a(돈고)x(고) + a(돈콩)x(콩) + a(돈쌀)x(쌀)과 같은 형태의 식은 다루기 쉽고, 예측하기도 좋아 깔끔하게 노의할 수 있습니다. 이 '순수함'을 멋있게 바꿔 말하면 "정의한 '벡터의 덧셈과 정수배'를 제대로 유지하다"라고 표현됩니다. 이는 행렬 A에 대해 ' x + y = z 에서 Ax+ Ay= Az' , 'cx = y에서 c(Ax) = Ay'라는 의미입니다.
정리하면 행렬이란 순수한 관곌르 나타내는 편리한 기법입니다.
1,15 행렬이 '순수한 관계'라는 것을 알았습니다. 반대로 '순순한 관계'는 모두 행렬이라 생각해도 될까요?
일반ㄴ적으로 f(x + y) = f(x) + f(y), f(cx) = cf(x)라는 성질을 지닌 사상 f를 선형 사상이라고 합니다(x, y는 같은 크기의 벡터, c는 수, f(x)의 값은 벡터라고 합니다). 즉, 본문을 고쳐 말하면 '행렬 A를 곱한다는 사상은 선형 사상이다'라는 것입니다. 그 반대로 말할 수 있어서 임의의 선형 사상f는 '행렬을 곱한다'는 형태로 반드시 쓸 수 있습니다. 실제로 e1 = (1,0,0,0,....,0)T, e2=(0,1,0,0,....,0)T.....를 각각 입력한 때의 출력을 ai = f(ei) 로 두면 입력 x=(x1, ...,xn)T에 대한 출력은 f(x) = x1a1+....+xnan이 됩니다. 종벡터 a1, ....an을 나열한 행렬 A = (a1, a2,....,an)를 사용하면 이것은 f(x)= Ax로 쓸 수 있습니다(1.2.9절 '블록행렬'). 멋있게 말하면 행렬이란 '선형 사상을 좌표 성분으로 표시한 것'입니다.
1.2.2 여러 가지 관계를 행렬로 나타내다(1)
앞 절에서 설명했듯이 "행렬을 곱하다"는 순수한 관계'를 나타냅니다. "상승 효과나 규모 효과가 없고, 단순히 가 요인의 합계다'라는 순수한 관계는 여기저기서 맞딱드리게 됩니다. 대상 자체가 곧은 경우도 있고, 복잡한 것에 대한 근사 모델로 가정된 경우로 있는 것은 0.2절 '근사 수단으로 사용하기 편리하다'에 서술한 대로입니다.
학 거북이 계산
학이 x(학)마리, 거북이가 x(거북)마리 있다면 머리의 개수 y(머리)와 다리의 개수 y(다리)는 다음과 같습니다.
y(머리) = a(학머리)x(학) + a(거북머리)x(거북) = x(학) + x(거북)
y(다리) = a(학다리)x(학) + a(거북다리)x(거북) = 2x(학) + 4x(거북)
a(학머리)=1 은 학 한 마리의 머리 개수, a(거북다리) = 4는 거북이 한 머리의 다리 개수라는 형태 입니다. 이를 행렬로 쓰면 다음과같습니다.
이것도 상승 효과나 규모 효과가 없는 순수한 관꼐네요. 학 열 마리의 다리 개수는 학 한 마리의 다리 개수를 단순히 10배하면 됩니다. 집단 A와 집단B를 합쳐 놓은 머리의 총 개수는 A의 머리 개수와 B의 머리 개수를 단순히 더하면 됩니다.
제품과 필요 원료
다음과같은 예도 생각할 수 있습니다.
- 제품 1을 한개 만드는 데는 원료 1, 2, 3이 각각 a11, a21, a31 그램씩 필요
- 제품 2을 한개 만드는 데는 원료 1, 2, 3 이 각각 a12, a22, a32 그램씩 필요
지금 제품 1,2를 각각 x1, x2개 만든다면 원료 1,2,3의 필요량 y1,y2,y3은 다음과 같이 구할 수 있습니다.
그 외 여러 가지
그 외에도 다양한 경우에서 y = Ax 형태의 관계를 만나게 됩니다. 자세히 설명하려면 각 분야의 전문 지식이 필요하므로 여기서는 예만 들어 보겠습니다. 다음과 같은 것이 있습니다.
- 회로망 이론( LCR 회로의 전류와 전압)
- 신호 처리(선형 필터, 푸리에 변환, 웨이블릿 변환)
- 제어 이론(선형 시스템)
- 통계 분석(선형 모델)
y= Ax라는 형태로 노골적으로 쓰진 않아도 그렇게 해석 가능한 경우도 있습니다.
1.2.3 행렬은 사상이다.
n차원 벡터 x에 m*n 행렬 A를 곱하면 m차원 벡터 y = Ax가 얻어집니다. 즉, 행렬A를 지정하면 벡터를 다른 벡터에 옮기는 사상이 결정됩니다. 사실 이것이야말로 행렬의 가장 중요한 기능입니다. 지금부터는 행렬을 보면 단순히 '수가 나열되어 있다'라고 생각하지 말고, '사상이 주어졌다'고 생각해 주십시오. 계속해서 강조하겠습니다.
행렬은 사상이다.
사상이라는 언어는 조금 위압감이 있을지도 모릅니다. 일반적으로 쓰이는 '변환'이란 말도 있지만, 수학용어로서의 변환에는 '대등한 것에 이동한다'라는 의미가 있습니다. n차원 공간에서 m차원 공간이라는 다른 세계에 옮기는 것을 변환이라고 부를 수 없으므로 사상이라는 조금 더 넓은 언어를 사용했습니다.
자, 이 설명만으로는 아직 '점을 점으로옮긴다'는 이미지겠지요. 여기서 조금 더 힘을 내 '공간 전체가 어떻게 변하는 가'를 떠올릴 수 있다면 선형대수가 매우 알기 쉬워질 것입니다. '백문이 불여일견, 이 장에서는 이 변형을 애니메이션 프로그램으로 실제로 관찰해 봅시다.
1.2.4 행렬의 곱 = 사상의 합성
행렬끼리의 곱을 다음과 같이 정의 합니다.
곱 k*m 행렬 B = (bij)와 m*n 행렬 A = (ajp)에 대해
각 행렬의 크기에 주의합니다. k * m 행렬의 곱이 k * n 입니다.
계산은 다음 방법을 추천합니다.
1. 오른쪽 행렬을 세로 단락으로 분해한다.
2. 분해한 각각에 왼쪽 행렬을 곱한다(행렬과 벡터의 곱으로서).
3. 결과를 접착
구체적으로는 다음과 같은 요령입니다.
처음 보면 "이건 뭐야"라는 반응이 보통입니다. 이는 '사상의 합성'을 나타냅니다. 벡터 x를 우선 사상 A로 날려버리고, 목적한 곳 y = Ax역시 사상 B 로 날렸다고 합시다. 최종 종착지는 z = B(Ax) 입니다. 여기서 행렬의 곱 BA는 x를 z에 단숨에 날리는 사상인 것입니다.
요약하면 'A하고, B한다'가 곱 BA인 것입니다. 식으로 쓰면 다음과 같습니다.
(BA)x = B(Ax)
어떠한 x에도 성립합니다. 일단 이해가 되면 같은 것을 굳이 구별할 필요가 없으므로 보통은 괄호를 생략하고 BAx처럼 씁니다. (BA)x로 해석해도, B(Ax)로 해석해도 답은 같습니다.
이 '의미'와 '계산법'의 관계는 그림 1-13을 보면서 이미지화 해보세요. B의 폭(열수)과 A의 높이(행 수)가 맞지않으면 안되는 것도 이 그림을 보고 이해할 수 있을 것입니다.
1.17 A하고, B한다면 AB가 아닌가요?
'f한 것을 g한다'는 g(f(x))이지요, 옐르 들어 '대문자로 출력한다'라면 putchar(toupper(x))입니다. 이와 같은 의미로 BAx가 정답입니다. 이 스타일로 쓰는 한 조각 순서와 표기 순서가 반대인 것은 어쩔 수 없습니다.
다음으로 세 행렬 A, B, C의 곱도 생각해 봅시다. 예상대로 'A하고, B하고, C하는 것은 CBA'입니다. 여기서 포인트는 다음 어느 것이어도 결과가 같다는 것입니다.
- 'A하고, B한다'를 하고 나서 C를 한다.
- A를 하고 나서 'B하고, C한다'를 한다.
식으로 쓰면 다음과 같습니다.
C(BA) = (CB)A
마찬가지로 행렬이 네 개인 경우를 봅시다.
D(C(BA)) = D((CB)A) = (D(CB))A = (DC)(BA)
이렇게 괄호를 붙여도 결국 같습니다. 그러므로 보통은 괄호 따위 붙이지 않고 CB
A 나 DCBA처럼 씁니다.
그러나 BA와 AB는 같지 않습니다. 우선 A,B의 크기에 따라 처음부터 곱이 정의되지 않습니다.
또한, 만약 가능해도 결과는 대부분 다릅니다.
사실 행렬 A는 공간을 '돌린다', 행렬 B는 공간을 '가로로 넓히다'라는 효과가 있습니다. A와 B의 곱은 BA라면 돌려서 가로로 늘리고, AB라면 가로로 넓혀서 돌리는 것이 됩니다. 결과는 서로 다릅니다.
1.18 곱의 정의식(1.9)의 어디를 어떻게 보면 '이것은 사상의 합성이다' 라고 알 수 있나요?
행렬의 각 열은 각 축 방향의 단위 벡터 e1, .... em의 목적지가 된다는 지적을 우선 떠올려주세요(1.2.3절 '행렬은 사상이다'). 지금 'A하고, B한다'에 대응하는 행렬을 C라고 합시다. C의 1열인 c1을 알기 위해서는 e1 = (1,0,,,,,0)T가 C에서 어디로 갈지를 알아보면 됩니다. 즉, e1에 A를 고하여 거기에 더욱이 B를 곱한 어느 곳에 가는가 입니다.
1스텝의 Ae1은 물론 A의 1열a1이 됩니다. 그러므포 2스텝의 목적지는 c1 = Ba1입니다. 다른 것도 같으므로 C의 i열 ai에 B를 곱한 것디 됩니다. 다시 말해서 C=BA를 구하기 위해서는 행렬과 벡터의 곱 Ba1, ,,,, Bam을 계산해 두고, 그 결과를 나열하여 붙이면 됩니다. 이것은 좀 전에 서술한 '암기법' 그 자체입니다. 그러므로 '곱은 사상의 합성이다'라고 할 수 있습니다. 1.2.9절에서는 '열벡터'라는 언어를 사용하여 같은 내용을 한번 더 확인합니다.
1.2.5 행렬 연산의 성질
기본적인 성질
수 c, c', 벡터 x, 행렬 A, B, C에 대해 다음 성질이 성립합니다. 벡터나 행렬의 크기는 연산되도록 설정했습니다.
- (cA)x = c(Ax) = A(cx)
- (A + B)x = Ax + Bx
- A + B = B + A
- (A + B) + C = A + (B + C)
- (c + c')A = cA + c'A
- (cc')A = c(c'A)
- A(B + C) = AB + AC
- (A + B)C = AC + BC
- (cA)B = c(AB) = A(cB)
벡터도 행렬의 일종?
이미 잠깐 설명했듯이 n차원 벡터를 n * 1행려로 간주하여 덧셈, 정수배, 곱을 계산해도 결과는 같습니다.
1.2.6 행렬의 거듭제곱 = 사상의 반복
숫자에서와 같은 방식으로 정방행렬 A에 대해 다음과 같이 씁니다(정방이 아니면 처음부터 곱 AA가 정의되지 않습니다(크기가 맞지 않습니다.)).
사상으로 A2은 'A하고 한층 더 A한다', A3은 'A하고 A하고 A한다', An은 'A를 n번 반복 적용한다' 입니다. 거듭제곱은 가감승제보다도 먼저 계산하는 규칙입니다.
1.2.7 영행렬, 단위행렬, 대각행렬
특별한 행렬에는 이름을 붙여 둡시다.
- 영행렬
모든 성분이 0인 행렬을 영행렬이라 하고, 기호 O로 나타냅니다. 크기를 명시하고 싶을 때는 m*n 영행렬 Omn이나 n차 정방영행렬 On처럼 쓰기도 합니다.
영행렬이 나타내는 사상은 모든 것을 원점으로 이동시키는 사상입니다. 임의의 벡터 x에 대해 Ox = o이기 때문입니다.
- 단위행렬
정방행렬에서 대각선 위만 1이고 다른 것은 0인 행렬을 단위행렬이라고 하고, 기호 I로 나타냅니다. 크기를 명시하고 싶을때는 n차 단위행렬 In처럼 쓰기도 합니다.
'모든 성분이 1인 행렬'은 아니므로 주의합시다. 사상으로서의 의미를 보면 이해될 것입니다. 단위행렬이 나타내는 사상은 '아무것도 하지 않는' 사상입니다. 임의의 백터 x에 대해 Ix = x이므로 x를 원래 x 그래도 이동한다는 것을 알 수 있습니다. ㄱ
- 대각행렬
정방행렬의 대각선상의 값을 대각성분이라고 합니다.
대각성분 이외의 값은 비대각성분이라고 합니다.
비 대각성분이 모두 0인 행렬을 대각행렬이라 부릅니다.
거의 대부분 0인데 지면을 소비하면 아까우므로 다음과 같이 줄여서 씁니다. diag는 diagonal(대각선)의 줄임말입니다.
대각행렬이 나타내는 사상은 '축에 따르는 신축(늘고 줄음)이고, 대각성분이 각 축의 늘고 주는 배율이 됩니다. 따라서 대각성분 여하에 따라 공간이 변하는 모습도 다릅니다.
1.2.8 역행렬 = 역사상
다음은 A에 이동시킨 것을 원래대로 돌려 놓은 이야기입니다. 이 이야기는 2장에서 설명할 '결과에서 원인을 구한다'라는 주제와도 관련이 있습니다.
정의
정방행렬 A에 대해 그 역사상에 대응하는 행렬을 'A의 역행렬'이라고 하고, 기소 A-1이라 씁니다. 어떠한 x를 가져와도 'Ax = y 또는 A-1y = x'이고, 반대로 어떠한 y를 가져와도 A-1y = x또는 Ax =y'가 되는, 그런 행렬 A-1입니다. 대략 '이동점 y를 갖고 원래의 점 x를 구하다'라는 사상에 대응하는 행렬이 A-1입니다.
다르게 표현하면 A하고 A-1하면 원래대로 돌아가고, A-1하고 A해도 원래대로 돌아갑니다. 즉 다음과 같습니다.
A-1A = AA-1 = I
역행렬은 있을 수도, 없을 수도 있습니다. 직관적으로 말하면 '납작하게 눌리는' 경우는 역행렬이 존재하지 않습니다. 왜냐하면, '눌린다'는 것은 '서로 다른 두 점 x, x'가 A를 적용하면 같은 점 y = Ax = Ax'로 이동한다'라는 것이기 때문입니다. 그렇게 되면 '이동점이y'라고 주어져도 원래가 x였는지 x'였는지 구별이 안 됩니다. 즉, '이동점y를 들고 원래의 점 x를 답하는 사상'이라 만들수가 없습니다.
1.2.9 블록행렬
'큰 문제를 작은 부분 문제로 분할하는 것'은 복잡합에 대처하는 수단으로 효과가 있습니다. 행렬 연산에도 실은 그런 분할이 가능합니다.
정의와 성질
행렬의 종횡에 단락을 넣어 각 구역을 작은 행렬로 간주한 것을 블록행렬이라고 합니다.
쉬운 선형대수 책에는 그다지 실리지 않는 소재입니다만, 응용할 때 자주 사용하는 테크닉이므로 설명해 두겠습니다.
크기가 같은 블록 행렬 A=(Aij)와 B=(Bij), 수 c에 대해 다음 성질이 성립합니다.
행벡터, 열벡테
블록행렬의 특별한 경우로 다음과같이 한 방향으로만 작게 나누는 것도 생각해 볼 수 있습니다.
단락지어진 각 단편의 크기가 n*1이나 1*n'이므로 각 단락을 벡터라고 간주하는 것도 가능합니다. 그런 이유로 위 행렬처럼 나타났을 때 a1, a2...am을 'A의 열벡터'라고 하고,
2018년 2월 3일 토요일
1장 벡터,.행렬.행렬식 -'공간'에서 생각하자
1.1 벡터와 공간
1.2 행렬과 사상
1.3 행렬식과 확대율
0.1 절에서 설명했듯이 무엇가를 하려고 할 때 많은 수치를 묶은 데이터를 다루고 싶은 경우가 생길 것입니다. 그러한 데이터를 단순히 '수치의조합'으로 다루는 것이 아니라, '공간 안의 점'으로간주하여 직관을 활용하는 것이 이 책 전체의 주제입니다.
그 중심이 되는 개념인 '벡터'와 '행렬', 그리고 쓰만한 보조역인 '행렬식'을 이 장에서 설명합니다. 선형대수를 아무리 생각 없이 공부하면 무의식 중에 문자 배열에만 누이 가기 쉽습니다. 그래서는 직관을 활용할 수 없습니다. '공각'이라는 생걱을 잊지 마세요.
문자 배열(표면상) 의미
벡터 숫자를 일렬로 늘어 놓은 것 화살표, 또는 공간 안의 점
행렬 숫자를 직사각형으로 늘어 놓은것 공간에서 공간으로의 직교 사상
행렬식 뭔가 귀찮은 계산 위의 사상에 따른 부피 확대율
이 장은 기술적인 측면에서 사칙연사을 정복하는 것이 목표입니다. 구체적으로 말하면 수치가 주어진 벡터.행렬뿐만 아니라 문자식에 대해서도 '실제의 모습'을 의식하여 계산할 수 있는 것이 중요합니다(1.2.16절 크기에 구애되라). 신호 처리나 데이터 분석 등 '선형대수를 도구로 사용하는 응용 분야'에서는 문자식을 제대로 다루지 않으면 따라갈 수 없기 때문입니다.
1.2 행렬과 사상
1.3 행렬식과 확대율
0.1 절에서 설명했듯이 무엇가를 하려고 할 때 많은 수치를 묶은 데이터를 다루고 싶은 경우가 생길 것입니다. 그러한 데이터를 단순히 '수치의조합'으로 다루는 것이 아니라, '공간 안의 점'으로간주하여 직관을 활용하는 것이 이 책 전체의 주제입니다.
그 중심이 되는 개념인 '벡터'와 '행렬', 그리고 쓰만한 보조역인 '행렬식'을 이 장에서 설명합니다. 선형대수를 아무리 생각 없이 공부하면 무의식 중에 문자 배열에만 누이 가기 쉽습니다. 그래서는 직관을 활용할 수 없습니다. '공각'이라는 생걱을 잊지 마세요.
문자 배열(표면상) 의미
벡터 숫자를 일렬로 늘어 놓은 것 화살표, 또는 공간 안의 점
행렬 숫자를 직사각형으로 늘어 놓은것 공간에서 공간으로의 직교 사상
행렬식 뭔가 귀찮은 계산 위의 사상에 따른 부피 확대율
이 장은 기술적인 측면에서 사칙연사을 정복하는 것이 목표입니다. 구체적으로 말하면 수치가 주어진 벡터.행렬뿐만 아니라 문자식에 대해서도 '실제의 모습'을 의식하여 계산할 수 있는 것이 중요합니다(1.2.16절 크기에 구애되라). 신호 처리나 데이터 분석 등 '선형대수를 도구로 사용하는 응용 분야'에서는 문자식을 제대로 다루지 않으면 따라갈 수 없기 때문입니다.
0장 왜 선형대수를 배워야 하는가?
0.1 공.간이라고 생각하면 직관이 먹힌다.
우리는 3차원 공간에 살고 있습니다. 3차원 세계의 일을 다루기 위해서는 '공간'을 잘 기술할 수 있는 용어가 필요합니다. 컴퓨터 그래픽스, 자동차 네비게이션, 게임 등이 대표적인 예일 것입니다. 선형대수의 무대가 되는 벡터 공간은 현실 공간의 성질을 특정 수준에서 추상화한 것입니다. 따라서 선형대수는 공간을 설명하는데 편리한 용어나 개념을 제공해 줍니다. 예를 들어 "2차원 평면에 3차원 물체를 어떻게 그릴 것인가"를 궁리한다면 "3차원 공간 중 이곳에 이런 물체가 있을 때 시점을 이런 식으로 이동.회전시키면 누에는 어떤 2차원 화상이 나타날까" 라는 문제가 발생합니다. 이러한 문제에서도 선형대수 용어는 기초적인 역할 을 담당합니다.
그러나 오직 현실 공간의 문제를 해결하기 위해 선형대수를 배우는 것은 아닙니다.
무슨 일을 해도 단일 수치가 아닌, 다수의 수치를 조합한 데이터를 다루고 싶은 경우가 나타날것입니다. 이 경우는 '공간'과 직접적인 관계가 없으므로일부러 공간을 의식하지 않고 다룰수 있습니다. 그렇지만 이 데이터를 '고차원 공간 내의 점'이라고 해석하면 '공간'에 대한 우리의 직관을 활용하는 것도 가능합니다.
우리는 3차원 공간만 인식할 수 있지만, 3차원 공간으로부터 유추하여 직관적으로 이해할 수 있는 '일반의 n차원에서 성립하는 현상'도 많습니다. 실제로 이러한 해석은 데이터 분석의수단으로 효과가 있습니다. 그리고 '공간'의 문제가 되면 선형대수가 나설 차례입니다. 주성분 분석이나 최소제곱법 등이 고전적이고 대표적인 예입니다. 이 책에서느닝러한 방향으로 응용도 염두에 두고 설명할 것입니다.
0.2 근사 수단으로 사용하기 편리하다
선형대수가 다루는 대상은 선형적, 즉 직선이나 평면처럼 '곧은 것'입니다. 곧은 대상이므로 다루기 쉽고, 예측하기 좋으며, 명쾌한 결과를 얻을수 있습니다.
"쉬운 문제만 다룬다는 것이낙? 쉬운 문제를 잘 풀 수 있다고 해도 전혀 훌륭하지 않아" 라고 생각해도 당연합니다. '곧은 것'만 다뤄서는 대단히 궁색하죠. 곡면을 그리고 싶을 수도 있고요. 그래프를 그리면 곡선이 되는 현상 또한 있을 것입니다.
그래서 선형대수는 유효합니다. 왜냐하면 대상의 대부분의 줌업(zoom up,확대)하면 거의다 곧기 때문입니다. 질이 나쁜 들쭉날쭉한 예를 제외하면 곡선이라도, 고면이라도, 충분히 확대해보면 곧게 보입니다. 이 경우 작은 범위를 생각하는 한, '곧다'라고 근사해도 그 나름대로 도움이 되는 결과를 얻을 수 있습니다. 곡면을 그릴 때도 '작은 평면의 조립'으로 근사 표현합니다. 그래프가 곡선이어도 단기 예측이라면 직선으로 근사하여 연장합니다. 이러한 방법이 어느 정도 유효한지는 무엇을 하고 싶은지에 따라 다릅니다. '우와, 조잡하다'라고 생각할지도 모르지만, 이와 비슷한 접근법은 의외로 많이 사용하고 있습니다. 진지하게 식을 세우기 어렵고 힘들 때, '우선 곧은 것으로 근사해보자'라는 방법은 공학에서는 상투적인 방법입니다. '이정도로 만족'인지 '다른 좋은 방법이 없다'인지는 한마디로 말하기 힘듭니다.
이 책을 읽으면서 '문제 선정이 너무 한정적이다. 이런 방법이 사용되는 경우는 거읭 ㅓㅂㅅ겠지'라고 느낀다면 이 이야기를 떠올려 주십시오.
우리는 3차원 공간에 살고 있습니다. 3차원 세계의 일을 다루기 위해서는 '공간'을 잘 기술할 수 있는 용어가 필요합니다. 컴퓨터 그래픽스, 자동차 네비게이션, 게임 등이 대표적인 예일 것입니다. 선형대수의 무대가 되는 벡터 공간은 현실 공간의 성질을 특정 수준에서 추상화한 것입니다. 따라서 선형대수는 공간을 설명하는데 편리한 용어나 개념을 제공해 줍니다. 예를 들어 "2차원 평면에 3차원 물체를 어떻게 그릴 것인가"를 궁리한다면 "3차원 공간 중 이곳에 이런 물체가 있을 때 시점을 이런 식으로 이동.회전시키면 누에는 어떤 2차원 화상이 나타날까" 라는 문제가 발생합니다. 이러한 문제에서도 선형대수 용어는 기초적인 역할 을 담당합니다.
그러나 오직 현실 공간의 문제를 해결하기 위해 선형대수를 배우는 것은 아닙니다.
무슨 일을 해도 단일 수치가 아닌, 다수의 수치를 조합한 데이터를 다루고 싶은 경우가 나타날것입니다. 이 경우는 '공간'과 직접적인 관계가 없으므로일부러 공간을 의식하지 않고 다룰수 있습니다. 그렇지만 이 데이터를 '고차원 공간 내의 점'이라고 해석하면 '공간'에 대한 우리의 직관을 활용하는 것도 가능합니다.
우리는 3차원 공간만 인식할 수 있지만, 3차원 공간으로부터 유추하여 직관적으로 이해할 수 있는 '일반의 n차원에서 성립하는 현상'도 많습니다. 실제로 이러한 해석은 데이터 분석의수단으로 효과가 있습니다. 그리고 '공간'의 문제가 되면 선형대수가 나설 차례입니다. 주성분 분석이나 최소제곱법 등이 고전적이고 대표적인 예입니다. 이 책에서느닝러한 방향으로 응용도 염두에 두고 설명할 것입니다.
0.2 근사 수단으로 사용하기 편리하다
선형대수가 다루는 대상은 선형적, 즉 직선이나 평면처럼 '곧은 것'입니다. 곧은 대상이므로 다루기 쉽고, 예측하기 좋으며, 명쾌한 결과를 얻을수 있습니다.
"쉬운 문제만 다룬다는 것이낙? 쉬운 문제를 잘 풀 수 있다고 해도 전혀 훌륭하지 않아" 라고 생각해도 당연합니다. '곧은 것'만 다뤄서는 대단히 궁색하죠. 곡면을 그리고 싶을 수도 있고요. 그래프를 그리면 곡선이 되는 현상 또한 있을 것입니다.
그래서 선형대수는 유효합니다. 왜냐하면 대상의 대부분의 줌업(zoom up,확대)하면 거의다 곧기 때문입니다. 질이 나쁜 들쭉날쭉한 예를 제외하면 곡선이라도, 고면이라도, 충분히 확대해보면 곧게 보입니다. 이 경우 작은 범위를 생각하는 한, '곧다'라고 근사해도 그 나름대로 도움이 되는 결과를 얻을 수 있습니다. 곡면을 그릴 때도 '작은 평면의 조립'으로 근사 표현합니다. 그래프가 곡선이어도 단기 예측이라면 직선으로 근사하여 연장합니다. 이러한 방법이 어느 정도 유효한지는 무엇을 하고 싶은지에 따라 다릅니다. '우와, 조잡하다'라고 생각할지도 모르지만, 이와 비슷한 접근법은 의외로 많이 사용하고 있습니다. 진지하게 식을 세우기 어렵고 힘들 때, '우선 곧은 것으로 근사해보자'라는 방법은 공학에서는 상투적인 방법입니다. '이정도로 만족'인지 '다른 좋은 방법이 없다'인지는 한마디로 말하기 힘듭니다.
이 책을 읽으면서 '문제 선정이 너무 한정적이다. 이런 방법이 사용되는 경우는 거읭 ㅓㅂㅅ겠지'라고 느낀다면 이 이야기를 떠올려 주십시오.
2018년 2월 1일 목요일
1.1 학습의 종류
1.1 학습의 종류
일반화 능력을 갖도록 하는 것
1.1.2 비지도학습
1.1.3 가화 학습
일반화 능력을 갖도록 하는 것
1.2 머신러닝 과업들
1.2.1 희귀(regression)
실숫값 함수를 표본점으로부터 근사하는 지도 학습 방식의 함수 근사 문제다.
1.2.2 분류
주어진 패턴을 식별하는 지도 학습 방식의 패턴 인식 문제다
1.2.3 이상 검출
1.2.4 클러스터링
1.2.5 자원축소
1.3 머신러닝의 접근법
머신러닝에는 다양한 계파가 있다. 이 절에서는 패턴 x의 유형 y를 예측하는 분류 문제를 예로 들어, 머신러닝의 주된 계파인 생성적 분류와 식별적 분류, 그리고 빈도주의 및 베이지안 접근법에서 기초가 되는 아이디어도 소개한다.
1.3.1 생성적 분류와 식별적 분류
패턴 x가 주어졌을 때 유형 y의 조건부 확률 p(y|x)가 최대가 되도록 하는 유형 y를 구할 수 있으면, 패턴 인식을 수행할 수 있다.
1.3 머신러닝의 접근법
머신러닝에는 다양한 계파가 있다. 이 절에서는 패턴 x의 유형 y를 예측하는 분류 문제를 예로 들어, 머신러닝의 주된 계파인 생성적 분류와 식별적 분류, 그리고 빈도주의 및 베이지안 접근법에서 기초가 되는 아이디어도 소개한다.
1.3.1 생성적 분류와 식별적 분류
패턴 x가 주어졌을 때 유형 y의 조건부 확률 p(y|x)가 최대가 되도록 하는 유형 y를 구할 수 있으면, 패턴 인식을 수행할 수 있다.
2018년 1월 24일 수요일
2. 지도 학습
2.1 분류와 희귀
지도 학습에는 분류(classification)와 희귀(regression)가 있습니다.
분류는 미리 정의된, 가능성 있는 여러 클래스 레이블(class label)중 하나를 얘측
이진 분류(binary classification): 두 개의 클래스로 분류
한 클래스를 양성(positive)클래스, 다른 하나를 음성(negative)클래스
다중 분류(multiclass classification): 셋 이상의 클래스로 분류
희귀는 연속적인 숫자, 또는 프로그래밍 용어로 말하면 부동소수점수(수학 용어로는 실수)를 예측하는 것
ex)어떤 사람의 교육 수준, 나이, 주거지를 바탕으로 연간 소득을 예측하는 것
출력값에 연속성이 있는지 여부로 휘귀와 분류를 구분할 수 있습니다.
연속성이 있으면 희귀
연속성이 없으면 분류
2.2 일반화, 과대적합, 과소적합
지도 학습에서는 훈련 데이터로 학습한 모델이 훈련 데이터와 특성이 같다면 처음 보는 새로운 데이터가 주어져도 정확히 예측할 거라 기대합니다. 모델이 처음 보는 데이터에 대해 정확하게 예측할 수 이/ㅅ으면 이를 훈련 세트에서 테스트 세트로 일반화(generalization)되었다고 합니다. 그래서 모델을 만들 때는 가능한 정확하게 일반화되도록 해야 합니다.
보통 훈련 세트에 대해 정확히 예측하도록 모델을 구축합니다. 훈련 세트와 테스트 세트가 매우 비슷하다면 그 모델이 테스트 세트에서도 정확히 예측하리라 기대할 수 있습니다. 그러나 항상 그런 것만은 아닙니다. 예를 들어 아주 복잡한 모델을 만든다면 훈련 세트에만 정확한 모델이 되어버릴수 있습니다.
가상의 예를 만들어 설명해보겠습니다. 초보 데이터 과학자가 요트를 구매한 고객과 구매의사가 없는 고객그의 데이터를이용해 누가 요트를 살지 예측하려 합니다. 그래서 관심없는 고객들을 성가시게 하지 않고 실제 구매할 것 같은 고객에게만 홍보 메일을 보내는 것이 목표입니다.
알고리즘이 새로운 데이터도 잘 측정하는 방법은 테스트 세트로 평가해보는 것밖에 없습니다. 그러나 직관적으로 보더라도(아마 수학적으로 볼때도) 간단한 모델이 새로운 데이터에 더 잘 일반화 될것이라고 예상할 수 있습니다. 만약 "50세 이상인 사람은 보트를 사려고 한다"라는 규칙을 만들었다면 이 규칙은 모든 고객데이터를 만족시킬 뿐 아니라, 나이 외에 자녀 수나 혼인 상태를 추가한 규칙보다 더 신뢰할 수 있습니다. 그렇기 때문에 우리는 언제나 가장 간단한 모델을 찾으려고 합니다. 초보 데이터 과학자가 했던것 처럼 가진 정보를 모두 사용해서 너무 복잡한 모덱을 만드는 것을 과대적합(overfitting)이라고 합니다. 과대 적합은 모델이 훈련 세트의 각 샘플에 너무 가깝게 맞춰져서 새로운 데이터에 일반화되기 어려울 때 일어납니다. 반대로 모델이 너무 간단하면, 즉"집이 있는 사람은 모두 요트를 사려고 한다"와 같은 경우에는 데이터의 면면과 다양성을 잡아내지 못할 것이고 훈련 세트에도 잘 맞지 않을 것입니다. 너무 가단한 모델이 선택되는 것을 과소적합(underfitting)이라고 합니다.
모델을 복잡하게 할 수록 훈련 데이터에 대해서는 더 정확히 예측할 수 있습니다. 그러나 너무 복잡해지면 훈련 세트의 가가 데이터 포인트에 너무 민감해져 새로운 데이터에 잘 일반화되지 못합니다.
2.2.1 모델 복잡도와 데이터셋 크기의관계
모델의 복잡도는 훈련 데이터셋에 담긴 입력 데이터의다양성과관련이깊습니다. 데이터셋에 다양한 데이터 포인트가 많을수록 과대적합 없이 더 복잡한 모델을 만들 수 있습니다. 보통 데이터 포인트를 더 많이 모으는 것이 다양성을 키워주므로 큰 데이터셋은 더 복잡한 모델을 만들 수 있게 해줍니다. 그러나 같은 데이터 포인트를 중복하거나 매우 비슷한 데이터를 모으는 것은 도움이 되지 않습니다.
2.3 지도 학습 알고리즘
2.3.1 예제에 사용할 데이터 셋
2.3.2 k-최근접 이웃
k-NN(k-Nearest Neighbors)알고리즘은 가장 간단한 머신러닝 알고리즘, 훈련 데이터셋에서 가장 가까운 데이터 포인트, 즉 '최근접 이웃'을 찾습니다.
2.3.3 선형 모델
희귀의 선형 모델
희귀를 위한 선형 모델은 특성이 하나일 땐 직선, 두 개일 땐 평면이 되며, 더 높은 차원(특성이 더 많음)에서는 초평면(hyperplane)이 되는 희귀 모델의 특징을 가지고 있습니다.
선형 희귀(최소제곱법)
선형 희귀(linear regression) 또는 최소제곱법(OLS, ordinary least squares)은 가장 간단하고 오래된 희귀용 선형 알고리즘입니다. 선형 희귀는 예측과 훈련 세트에 있는 타깃 y 사이의 평균제곱오차(mean squared error)를 최소하하는 파라미터 w와 b를 찾습니다. 평균제곱오차는 예측값과 타깃값의 차이를 제곱하여 더한 후에 샘플의 개수로 나눈 것입니다. 선형 희귀는 매개변수가 없는 것이 장점이지만, 그래서 모델의 복잡도를 제어할 방법도 없습니다.
지도 학습에는 분류(classification)와 희귀(regression)가 있습니다.
분류는 미리 정의된, 가능성 있는 여러 클래스 레이블(class label)중 하나를 얘측
이진 분류(binary classification): 두 개의 클래스로 분류
한 클래스를 양성(positive)클래스, 다른 하나를 음성(negative)클래스
다중 분류(multiclass classification): 셋 이상의 클래스로 분류
희귀는 연속적인 숫자, 또는 프로그래밍 용어로 말하면 부동소수점수(수학 용어로는 실수)를 예측하는 것
ex)어떤 사람의 교육 수준, 나이, 주거지를 바탕으로 연간 소득을 예측하는 것
출력값에 연속성이 있는지 여부로 휘귀와 분류를 구분할 수 있습니다.
연속성이 있으면 희귀
연속성이 없으면 분류
2.2 일반화, 과대적합, 과소적합
지도 학습에서는 훈련 데이터로 학습한 모델이 훈련 데이터와 특성이 같다면 처음 보는 새로운 데이터가 주어져도 정확히 예측할 거라 기대합니다. 모델이 처음 보는 데이터에 대해 정확하게 예측할 수 이/ㅅ으면 이를 훈련 세트에서 테스트 세트로 일반화(generalization)되었다고 합니다. 그래서 모델을 만들 때는 가능한 정확하게 일반화되도록 해야 합니다.
보통 훈련 세트에 대해 정확히 예측하도록 모델을 구축합니다. 훈련 세트와 테스트 세트가 매우 비슷하다면 그 모델이 테스트 세트에서도 정확히 예측하리라 기대할 수 있습니다. 그러나 항상 그런 것만은 아닙니다. 예를 들어 아주 복잡한 모델을 만든다면 훈련 세트에만 정확한 모델이 되어버릴수 있습니다.
가상의 예를 만들어 설명해보겠습니다. 초보 데이터 과학자가 요트를 구매한 고객과 구매의사가 없는 고객그의 데이터를이용해 누가 요트를 살지 예측하려 합니다. 그래서 관심없는 고객들을 성가시게 하지 않고 실제 구매할 것 같은 고객에게만 홍보 메일을 보내는 것이 목표입니다.
알고리즘이 새로운 데이터도 잘 측정하는 방법은 테스트 세트로 평가해보는 것밖에 없습니다. 그러나 직관적으로 보더라도(아마 수학적으로 볼때도) 간단한 모델이 새로운 데이터에 더 잘 일반화 될것이라고 예상할 수 있습니다. 만약 "50세 이상인 사람은 보트를 사려고 한다"라는 규칙을 만들었다면 이 규칙은 모든 고객데이터를 만족시킬 뿐 아니라, 나이 외에 자녀 수나 혼인 상태를 추가한 규칙보다 더 신뢰할 수 있습니다. 그렇기 때문에 우리는 언제나 가장 간단한 모델을 찾으려고 합니다. 초보 데이터 과학자가 했던것 처럼 가진 정보를 모두 사용해서 너무 복잡한 모덱을 만드는 것을 과대적합(overfitting)이라고 합니다. 과대 적합은 모델이 훈련 세트의 각 샘플에 너무 가깝게 맞춰져서 새로운 데이터에 일반화되기 어려울 때 일어납니다. 반대로 모델이 너무 간단하면, 즉"집이 있는 사람은 모두 요트를 사려고 한다"와 같은 경우에는 데이터의 면면과 다양성을 잡아내지 못할 것이고 훈련 세트에도 잘 맞지 않을 것입니다. 너무 가단한 모델이 선택되는 것을 과소적합(underfitting)이라고 합니다.
모델을 복잡하게 할 수록 훈련 데이터에 대해서는 더 정확히 예측할 수 있습니다. 그러나 너무 복잡해지면 훈련 세트의 가가 데이터 포인트에 너무 민감해져 새로운 데이터에 잘 일반화되지 못합니다.
2.2.1 모델 복잡도와 데이터셋 크기의관계
모델의 복잡도는 훈련 데이터셋에 담긴 입력 데이터의다양성과관련이깊습니다. 데이터셋에 다양한 데이터 포인트가 많을수록 과대적합 없이 더 복잡한 모델을 만들 수 있습니다. 보통 데이터 포인트를 더 많이 모으는 것이 다양성을 키워주므로 큰 데이터셋은 더 복잡한 모델을 만들 수 있게 해줍니다. 그러나 같은 데이터 포인트를 중복하거나 매우 비슷한 데이터를 모으는 것은 도움이 되지 않습니다.
2.3 지도 학습 알고리즘
2.3.1 예제에 사용할 데이터 셋
2.3.2 k-최근접 이웃
k-NN(k-Nearest Neighbors)알고리즘은 가장 간단한 머신러닝 알고리즘, 훈련 데이터셋에서 가장 가까운 데이터 포인트, 즉 '최근접 이웃'을 찾습니다.
2.3.3 선형 모델
희귀의 선형 모델
희귀를 위한 선형 모델은 특성이 하나일 땐 직선, 두 개일 땐 평면이 되며, 더 높은 차원(특성이 더 많음)에서는 초평면(hyperplane)이 되는 희귀 모델의 특징을 가지고 있습니다.
선형 희귀(최소제곱법)
선형 희귀(linear regression) 또는 최소제곱법(OLS, ordinary least squares)은 가장 간단하고 오래된 희귀용 선형 알고리즘입니다. 선형 희귀는 예측과 훈련 세트에 있는 타깃 y 사이의 평균제곱오차(mean squared error)를 최소하하는 파라미터 w와 b를 찾습니다. 평균제곱오차는 예측값과 타깃값의 차이를 제곱하여 더한 후에 샘플의 개수로 나눈 것입니다. 선형 희귀는 매개변수가 없는 것이 장점이지만, 그래서 모델의 복잡도를 제어할 방법도 없습니다.
2018년 1월 22일 월요일
1.7 첫 번째 애플리케이션: 불꽃의 품종 종류
붓꽃의 품종을 정확하게 분류한 데이터를 가지고 있으므로 지도 학습
몇 가지 선택사항(붓꽃의 품종) 중 하나를 선택
분류(Classfication), 출력될 수 있는 값(붓꽃의 종류)들을 클래스(class)
붓꽃 하나 에 대한 기대 출력은 꽃의 품종, 즉 품종을 레이블(Label)
1.7.1 데이터 적재
1.7.2 성과 측정: 훈련 데이터와 테스트 데이터
이 데이터로 머신러닝 모델을 만들고 새로운 데이터의 품종을 예측 하러 합니다. 하지만 만든 모델을 새 데이터에 적용하기 전에 이 모델이 진짜 잘 작동하는지 알아야 합니다. 다시 말해서 우리가 만든 모델의 예측을 신뢰할 수 있는 지 알아야 합니다.
불행이도 모델을 만들 때 쓴 데이터는 평가 목적으로 사용할 수 없습니다. 모델이 훈련 데이터를 그냥 전부 기억할 수 있으니 훈련 데이터에 속한 어떤 데이터라도 정확히 맞출 수 있기 때문입니다. 이렇게 데이터를 기억한다는 것은 모델을 잘 일반화 하지 않았다는 뜻입니다.(다른 말로는 새로운 데이터에 대해서는 잘 작동하지 않는다는 것입니다.)
모델의 성능을 측정하려면 레이블을 알고 있는 (이전에 본 적 없는) 새 데이터를 모델에 적용해 봐야 합니다. 이를 위해 우리가 가지고 있는 레이블된 데이터(150개의 붓꽃 데이터)를 두 그룹으로 나눈ㅂ니다. 그중 하나는 머신러닝 모델을 만들 때 사용하며, 훈련 데이터 혹은 훈련 세트(traning set)라고 합니다. 나머지는 모델이 얼마나 잘 작동하는지 측정하는 데 사용하며, 이를 테스트 데이터, 테스트 세트(test set)혹은 홀드아웃 세트(hold-out-set)라고 부릅니다.
scikit-learn은 데이터셋을 섞어서 나눠주는 train_test_split함수를 제공합니다. 이 함수는 전체 행 중 75%를 레이블 데이터와 함께 훈련 세트로 뽑습니다. 나머지 25%는 레이블 데이터와 함께 테스트 세트가 됩니다. 훈련 세트와 테스트 세트를 얼만큼씩 나눌지는 상활에 따라 다르지만 전체의 25%를 테스트 세트로 사용하는 것은 일반적으로 좋은 선택입니다.
1.7.3 가장 먼저 할 일: 데이터 살펴 보기
시각화는 데이터를 조사하는 아주 좋은 방법.산점도가 그중 하나입니다. 산점도는 데이터에서 한 특성을 x축에 놓고 다른 하나는 y축에 놓아 각 데이터 포인트를 하나의 점으로 나타내는 그래프. 아쉽게도 컴퓨터 화면은 2차원이라 한 번에 2개(혹은 3개)의 특성만 그릴 수 있습니다. 따라서 이 그래프는 3개 이상의 특성을 표현하기 어렵습니다. 대신 모든 특성을 짝지어 만드는 산점도 행렬을 사용할 수 있습니다.
이 그래프를 그리려면 먼저 NumPy 배열을 pandas의 DataFrame으로 변경해야 합니다. pandas는 산점도 행렬을 그려주는 scatter_matrix함수를 제공합니다.
1.7.4 첫 번째 머신러닝 모델: k-최근접 이웃 알고리즘
k-최근접 이웃 알고리즘에서 k 는 가장 가까운 이웃 '하나'가 아니라 훈련 데이터에서 새로운 데이터 포인트에 가장 가까운 'k개'의 이웃을 찾는다는 뜻
scikit-learn의 모든 머신러닝 모델은 Estimator라는 파이썬 클래스로 각각 구현되어 있습니다. k-최근접 이웃 분류 알고리즘은 neighbors 모듈 아래 KNeighborsClassifier 클래스에 구현되어있습니다. 모델을 사용하려면 클래스로부터 객체를 만들어야 합니다. 이때 모델에 필요한 매개변수를 넣습니다.
KNeighborsClassifier에서 가장 중요한 매개변수는 이숫의 개수입니다.
fit 메소드는 knn 객체 자체를 반환합니다.(그리고 knn객체 자체를 변경시킵니다.) 그래서 knn 객체가 문자열 형태로 출력됩니다. 이 출력에서 모델을 생성할 때 사용한 매개 변수를 볼 수 있습니다. 거의 모든 매개변수가 기본값이고 n_neighbors=1은 우리가 지정한 값입니다. scikit-learn 모델들이 많은 매개 변수를 가지고 있지만 대부분 성능을 최적화하거나 특별한 목적으로 사용합니다.
1.7.5 예측하기
1.7.6 모델 평가하기
몇 가지 선택사항(붓꽃의 품종) 중 하나를 선택
분류(Classfication), 출력될 수 있는 값(붓꽃의 종류)들을 클래스(class)
붓꽃 하나 에 대한 기대 출력은 꽃의 품종, 즉 품종을 레이블(Label)
1.7.1 데이터 적재
1.7.2 성과 측정: 훈련 데이터와 테스트 데이터
이 데이터로 머신러닝 모델을 만들고 새로운 데이터의 품종을 예측 하러 합니다. 하지만 만든 모델을 새 데이터에 적용하기 전에 이 모델이 진짜 잘 작동하는지 알아야 합니다. 다시 말해서 우리가 만든 모델의 예측을 신뢰할 수 있는 지 알아야 합니다.
불행이도 모델을 만들 때 쓴 데이터는 평가 목적으로 사용할 수 없습니다. 모델이 훈련 데이터를 그냥 전부 기억할 수 있으니 훈련 데이터에 속한 어떤 데이터라도 정확히 맞출 수 있기 때문입니다. 이렇게 데이터를 기억한다는 것은 모델을 잘 일반화 하지 않았다는 뜻입니다.(다른 말로는 새로운 데이터에 대해서는 잘 작동하지 않는다는 것입니다.)
모델의 성능을 측정하려면 레이블을 알고 있는 (이전에 본 적 없는) 새 데이터를 모델에 적용해 봐야 합니다. 이를 위해 우리가 가지고 있는 레이블된 데이터(150개의 붓꽃 데이터)를 두 그룹으로 나눈ㅂ니다. 그중 하나는 머신러닝 모델을 만들 때 사용하며, 훈련 데이터 혹은 훈련 세트(traning set)라고 합니다. 나머지는 모델이 얼마나 잘 작동하는지 측정하는 데 사용하며, 이를 테스트 데이터, 테스트 세트(test set)혹은 홀드아웃 세트(hold-out-set)라고 부릅니다.
scikit-learn은 데이터셋을 섞어서 나눠주는 train_test_split함수를 제공합니다. 이 함수는 전체 행 중 75%를 레이블 데이터와 함께 훈련 세트로 뽑습니다. 나머지 25%는 레이블 데이터와 함께 테스트 세트가 됩니다. 훈련 세트와 테스트 세트를 얼만큼씩 나눌지는 상활에 따라 다르지만 전체의 25%를 테스트 세트로 사용하는 것은 일반적으로 좋은 선택입니다.
1.7.3 가장 먼저 할 일: 데이터 살펴 보기
시각화는 데이터를 조사하는 아주 좋은 방법.산점도가 그중 하나입니다. 산점도는 데이터에서 한 특성을 x축에 놓고 다른 하나는 y축에 놓아 각 데이터 포인트를 하나의 점으로 나타내는 그래프. 아쉽게도 컴퓨터 화면은 2차원이라 한 번에 2개(혹은 3개)의 특성만 그릴 수 있습니다. 따라서 이 그래프는 3개 이상의 특성을 표현하기 어렵습니다. 대신 모든 특성을 짝지어 만드는 산점도 행렬을 사용할 수 있습니다.
이 그래프를 그리려면 먼저 NumPy 배열을 pandas의 DataFrame으로 변경해야 합니다. pandas는 산점도 행렬을 그려주는 scatter_matrix함수를 제공합니다.
1.7.4 첫 번째 머신러닝 모델: k-최근접 이웃 알고리즘
k-최근접 이웃 알고리즘에서 k 는 가장 가까운 이웃 '하나'가 아니라 훈련 데이터에서 새로운 데이터 포인트에 가장 가까운 'k개'의 이웃을 찾는다는 뜻
scikit-learn의 모든 머신러닝 모델은 Estimator라는 파이썬 클래스로 각각 구현되어 있습니다. k-최근접 이웃 분류 알고리즘은 neighbors 모듈 아래 KNeighborsClassifier 클래스에 구현되어있습니다. 모델을 사용하려면 클래스로부터 객체를 만들어야 합니다. 이때 모델에 필요한 매개변수를 넣습니다.
KNeighborsClassifier에서 가장 중요한 매개변수는 이숫의 개수입니다.
fit 메소드는 knn 객체 자체를 반환합니다.(그리고 knn객체 자체를 변경시킵니다.) 그래서 knn 객체가 문자열 형태로 출력됩니다. 이 출력에서 모델을 생성할 때 사용한 매개 변수를 볼 수 있습니다. 거의 모든 매개변수가 기본값이고 n_neighbors=1은 우리가 지정한 값입니다. scikit-learn 모델들이 많은 매개 변수를 가지고 있지만 대부분 성능을 최적화하거나 특별한 목적으로 사용합니다.
1.7.5 예측하기
1.7.6 모델 평가하기
피드 구독하기:
글 (Atom)