본문 바로가기

Software/Python

Python numpy 기초 - 선형대수학 풀어보기

뭐 당연한 이야기이지만... 다른 사람에게는 아무 의미도 없는 어떤 글... 물건.... 풍경 등등 사소한 일이 저에게는 아주 큰 의미를 가지는 경우가 있죠. 오늘 적을 내용이 또 그렇습니다. 비록.. 다들 머리 아파하는 수학입니다만^^. 철없을때 너~무 잘 놀고나서 딱 정신을 차린게 대학원에 진학하면서부터였죠^^. 그리고 그 후 하나하나 공부하면서 남들보다는 좀 느릴 수 있지만... 뭐 여하튼 꽤 재미있게 공부하고 또 즐거웠던 기간이 저의 대학원 생활이었습니다. 학부 3학년때 처음 대학원 실험실에 들어가서 3,4학년, 석사 1,2학년, 박사과정까지... 10년 가까이를 그 곳에서 보냈답니다. 그때 제 공부의 시작이 선형대수학이었구요. 그리고 박사과정때 시간강의를 했던 과목이 선형대수학과 공업수학이었답니다.^^. 오늘 그 내용을 Python으로 푸는 내용을 다룰려고 예전 자료를 잠시 들여다 보니 추억이~~~~^^



일단... numpy의 linalg (linear algebra) 모듈을 lin으로 import하구요. 두 행렬을 선언해 보았습니다.



dot()함수는 두 행렬의 곱을 의미합니다. 뒤에 .T는 전치행렬(transpose)을 의미하구요. 뭐 역시나 당연한 이야기지만 두 행렬을 곱할려면 당연히 크기를 m*n n*p 로 맞춰줘야하니 transpose를 시켜야지요^^



ㅎㅎ.. 위의 역행렬을 구하는 예제는 2009년 2학기에 제가 시간강의를 한 공업수학의 수업자료중 일부랍니다.[바로가기] 아무튼 위 예제의 역행렬을 구하는 예제를 아~~~주 간편히 Python numpy로 보면



위와 같습니다. inv()라는 함수를 이용해서 역행렬을 구한 것이지요.



또 qr 분해를 해주는 qr() 함수도 있습니다. qr 분해는 어떤 행렬을 직교행렬과 윗삼각행렬의 곱으로 표현하는 것입니다.[바로가기]



또 대각선 성분의 합을 구해주는 trace()함수도 있구요^^



위 예제는 2009년 2학기에 역시 강의했던 공업수학에서 행렬식(determinant) 구하는 예제였는데요[바로가기] 그걸 구하는 Python 예제를 보면



이네요~~~^^



이번에는 [바로가기]에서 다루었던 고유값과 고유벡터를 구하는 예제인데요. Python을 한번 이용해보죠.



쉽네요~~^^. 고유치(eigen value)와 고유벡터(eigen vector)를 모두 반환해 줍니다^^



앗~~~ 위 예제는 3항 연립방정식을 행렬을 이용해서 풀 수 있다는 예제[바로가기]였죠^^. 이번에는 이걸 Python을 이용해보죠^^





응??? Python numpy의 solve() 함수를 이용하면 연립방정식을 풀 수 있네요~~^^



이제는... 최소자승법입니다. 오늘 다룰 예제는 공식 홈페이지의 예제[바로가기]이구요. 살짝.. 위 방정식을 구할 수 있는 m과 c를 구하겠다는 예제이지요. 아... 이 최소자승법(least square)는 대학원 후반부에 제가 아주아주 잘 사용했던 내용입니다. 일단 이론적 배경은 저도 다루었었구요.[바로가기] 그때는 역시 수업자료였지요^^. 그리고 자이로센서와 가속도센서를 융합하는 관성항법장치를 다루면서 최소자승법을 유용히 사용했었지요.[바로가기]



아무튼.. 위와 같이 실제 취득한 데이터가 있습니다. 이 데이터를 이용해서 에러를 최소화하면서 직선으로 표현하고 싶은거죠. 일단 주어진 회로는 위와 같이 직선은 아닙니다^^



저걸 stack array로 변환해주는 vstack()함수[바로가기]를 이용해서 표현하고 최소자승법을 풀어주는 lstsq()를 이용하면 m, c를 얻을 수 있네요. 이제 1차식을 얻었습니다.



본래 데이터를 직선으로 표현할 수 있게 되었습니다^^ 이렇게 선형대수학을 풀어서 행렬 연산을 할 수 있게 되었습니다. 

이정도면 numpy를 사용하는데 큰~ 무리가 없으며 기초적 지식은 모두 이야기한 듯 해요~^^ 처음에는 배열을 언선하고[바로가기], 배열의 색인에 대해 좀 알아보고[바로가기], matplotlib를 inline으로 선언하고 그 예제로 meshgrid를 이야기했구요.[바로가기]. 그 후에 배열안에서 조건연산하는 것과 기초적인 통계관련 함수를 알아 보았네요^^[바로가기] 그리고, 기초 집합 연산도 알아보았습니다.[바로가기] 에휴~~~ 오랜만에 재미나게 내용을 정리했네요~~^^


반응형