블로그 이미지
자유로운설탕

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

'수학 라이브러리'에 해당되는 글 1

  1. 2017.05.06 구글로 공부하는 파이썬 - 15교시 (수학 라이브러리 살펴보기)
2017. 5. 6. 23:38 프로그래밍

  이번 시간의 주제는 향후 17교시에 '머신러닝에서의 파이썬의 역활'에 대한 얘기를 풀어보기 위한 사전 작업(밑밥...)이라고 볼수 있다. 파이썬에서 쓰는 여러가지 수학 라이브러리들을 어떤 관점에서 바라보는 것이 좋을지에 대해 설명 페이지와 간략한 샘플들을 통해 살펴보려고 한다.

 

 

[목차]

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

[들어가면서]

  머신러닝 관련 코드들을 보다 보면 numpy 나 pandas 같은 라이브러리(모듈)들이 단골로 등장 하게 된다. 대충 알기에는 해당 모듈들이 데이터들이 담긴 array 등을 처리해 주는 것으로 알고 있지만, 해당 라이브러리들이 도데체 어떤 기능들을 가지고 있길래 그렇게 자주 애용하게 되는걸까? 해당 코드들을 보면서 자주 쓰이는 기능들을 중심으로 이해하는 방법도 있겠지만, 실제 해당 라이브리러가 어떤 목적으로 만들어 졌고, 어떤 범위를 가지고 쓰이는지 전체적으로 살펴보는 것도, 그다진 나쁘진 않은 접근 방법이라고 생각하며 이야기를 시작한다.

 

  우선 파이썬에서 자주 쓰이는 수학 라이브러리들을 리스트업 하기 위해 구글에서 'python math libraries' 라고 검색한다. 아래의 페이지를 보면 2015년 8월 기준으로 파이썬 공식페이지에서 다운로드 수 기준으로 수학 라이브러리들의 순위를 매겼다.

http://www.palrad.com/top-python-math-statistics-libraries-w-12007/ 

 

  위로부터 7개 정도만 쭉 나열해 보면 NumPy, Pandas, Scipy, matplotlib, Patsy, Sympy, Plotly 이다. 이 중 matplotlib, Plotly 는 다음 시간에 살펴볼 그래픽 라이브러리라고 볼수 있고, Patsy 는 통계모델에 대한 라이브러리라는거 같아서 잘 모르니 패스하고, NumPy, Pandas, Scipy, Sympy 네 개의 라이브러리에 대해서 간단한 예제와 함께 살펴보려고 한다.

 

  실제로 'machine learning example' 또는 'tensorflow example' 등으로 구글에서 찾아서 아래의 이런 저런 페이지를 찾아 본 결과 그 이외의 특별한 라이브러리의 사용 예는 보이지 않았다.

http://machinelearningmastery.com/machine-learning-in-python-step-by-step/
https://www.toptal.com/machine-learning/machine-learning-theory-an-introductory-primer

https://github.com/aymericdamien/TensorFlow-Examples

 

 

 

 

[Numpy]

  어떻게 보면 파이썬을 이용하면서 가장 많이 보게 되는 수학 라이브러리 이다. 블로그의 예제들을 찾아보면서 쓰임을 알아 보는 것도 좋지만, 이렇게 유명한 라이브러리들은 설명 문서가 잘되어 있기 때문에, 해당 페이지를 전체적으로 훝어 보려고 한다. 그럼 구글에서 'numpy documentation' 라고 검색하면, 아래의 공식 문서 페이지가 나온다.

https://docs.scipy.org/doc/

 

  분위기를 보면 Numpy 와 Scipy 는 같은 목적에서 시작된 프로젝트 인거 같다. 'Numpy reference' 링크를 클릭한다.

https://docs.scipy.org/doc/numpy/reference/

 

  첫번째 'array objects' 설명을 보면(https://docs.scipy.org/doc/numpy/reference/arrays.html), 여러 차원의 array(수학적 의미로는 '행렬'이 적절할 듯 싶다)를 만들고, 임의의 부분만 짜르고, 특정 요소를 지정하고, 루프를 돌리고, array 차원을 재 배열 하고, 정렬하고 하는 등에 대한 설명들이 있다.

 

  두번째 'Universal functions' 설명을 보면(https://docs.scipy.org/doc/numpy/reference/ufuncs.html), 해당 array 를 수학적 연산에 의해 서로 사칙연산을 한다든지, 각각의 요소에 대해 로그 연산을 한다든지, 서로 비트 연산을 한다든지, 두개의 array 에서 최대 값들만을 뽑아 낸다든지 하는 여러가지 array 에 대한 연산들을 설명한다.

 

  세번째 'Routines' 에서는(https://docs.scipy.org/doc/numpy/reference/routines.html) 이제 상세한 부분으로 들어가 array 의 다양한 생성 방법이나, 합치거나, 자르는 등의 조작, 텍스트 및 스트링 등으로 읽거나 쓰기, 수학이나, 기본 통계함수 적용 등 상세한 사용시 필요한 세부 기능에 대해서 설명하는 듯 하다.

 

  그 이외는 다른 여러가지 기타 설명인걸 보니 결국 numpy 의 범위는 다양한 차원의 array 를 만들고, 해당 array 끼리 연산하거나, 각각의 array 요소들에 수학적 연산을 일괄 적용하거나, array 를 여러 다양한 차원의 형태로 자유롭게 변환하게 만들어 주는 라이브러리라고 봐도 무방할 듯 싶다. 그럼 간단한 샘플을 하나 만들어 보려고 한다.

 

 

  아래의 명령어로 numpy 를 설치 한다.

c:\Python\code>pip install numpy
Collecting numpy
  Downloading numpy-1.12.1-cp35-none-win_amd64.whl (7.7MB)
    100% |################################| 7.7MB 92kB/s
Installing collected packages: numpy
Successfully installed numpy-1.12.1

 

  해당 설명 페이지를 기반으로 샘플 기능을 만들어 보면 아래와 같다. 1) array 를 만들고, 2) 각 원소에 값을 더하거나, 3) array 를 재조정 하고 4) log 함수를 적용하는 등의 일을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-*- coding: utf-8 -*-
import numpy as np
 
# 2*2 array 를 만든다.
= np.array([[12], [34]])
 
# array 원소들에 모두 1을 더해 b array 를 만든다.
= a + 1
print (b)
 
# b array 를 재 정렬해 1*4 로 c array 로 변환한다.
= np.reshape(b, (1,4))
print (c)
 
# c array 원소들에 log 함수를 적용해 d array 를 만든다. 
= np.log(c)
print (d)
cs

 

  언제나처럼 c:\python\code 폴더에 numpytest.py 라고 저장하고, 아래와 같이 실행을 한다. (잘 모르시는 분은 2교시를 참조한다)

c:\Python\code>python numpytest.py
[[2 3]
 [4 5]]  -> 원래의 array 에 1을 더한 결과
[[2 3 4 5]]  -> 1*4 array 로 재 조정함.

[[ 0.69314718  1.09861229  1.38629436  1.60943791]]  -> 각 요소에 log 함수를 적용함.

 

 

 

 

[Scipy]

  아까 처음의 numpy documentation 페이지에서, 'scipy reference' 링크를 클릭한다.

https://docs.scipy.org/doc/scipy/reference/

 

  목차를 살펴보면 해당 라이브러리는 numpy 구조를 기반으로, 전문적인 과학분야의 수학연산들을 도와주는 라이브러리들이다. 적분(Intergration)이나, 영상이나 신호처리 영역에서 자주 쓰이는 푸리에 변환(fourier Transforms), 선형 대수(Linear Algebra), 통계학(Statistics) 등에서 필요한 수학적 연산들을 모아두었다고 보면 될거 같다. 해당 부분의 특징은 '구슬이 서말이라도 꿰어야 보배'라는 속담처럼 해당 분야에 대한 이해를 바탕으로 특정 연산을 수행하고 싶을 때야 의미가 있을 것 같다. 지금으로선 적분 관련된 예제 하나만 살짝 보고 넘어가려고 한다.

 

 

  우선 scipy 를 설치하는데 오랜만에 에러가 발생했다.

c:\Python\code>pip install scipy
Collecting scipy

...

numpy.distutils.system_info.NotFoundError: no lapack/blas resources found

 

  구글에서 'numpy.distutils.system_info.NotFoundError: no lapack/blas resources found' 라고 찾아서 스택오버플로우 페이지로 간다.

http://stackoverflow.com/questions/28190534/windows-scipy-install-no-lapack-blas-resources-found

 

  빌드 툴을 다운받거나 통합 패키지인 아나콘다를 다운 받으라는 등 여러가지 가이드가 있지만, 그 중에 wheel 파일이 있다고 그걸 가져다 설치해 보라는 내용이 눈에 띈다(예전 시간에 설명했지만, wheel 파일은 빌드된 바이너리가 zip 으로 압축된 형태의 파일이다.) 

 

  명시된 uci 대학교 홈페이지로 가서(http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy), 64비트이고, python 3.5 를 위해 빌드된 wheel 파일(scipy‑0.19.0‑cp35‑cp35m‑win_amd64.whl)을 다운받으려 하다보니, 아래와 같은 문구가 눈에 띈다. (사실은 해당 문구를 못보고 scipy 설치만 먼저하고 샘플 코드를 실행하니 에러가 나서 구글을 찾아서 다시 돌아 왔다--;). 기존 numpy 만을 설치하면 동작이 안되고 mkl 이라는 패키지와 통합된 numpy 를 설치해야 하나 보다

Install numpy+mkl before installing scipy.

 

  해당 링크로 가면 python 3.5 버전의 64비트 wheel 파일(numpy‑1.12.1+mkl‑cp35‑cp35m‑win_amd64.whl)이 보인다. 위의 scipy wheel 파일과 함께 두개의 파일을 다운하여 c:\python\code 폴더에 저장한다. 그리고 아래와 같이 명령어로 두개를 순서대로 설치한다. 

 

c:\Python\code>pip install numpy-1.12.1+mkl-cp35-cp35m-win_amd64.whl
Processing c:\python\code\numpy-1.12.1+mkl-cp35-cp35m-win_amd64.whl
Installing collected packages: numpy
Successfully installed numpy-1.12.1+mkl

 

c:\Python\code>pip install scipy-0.19.0-cp35-cp35m-win_amd64.whl
Processing c:\python\code\scipy-0.19.0-cp35-cp35m-win_amd64.whl
Successfully installed scipy-0.19.0

 

 

  위와 같은 y = x^2 인 함수에 대해서 0~1 구간을 적분하는 소스는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
#-*- coding: utf-8 -*-
from scipy.integrate import quad
 
# y=x^2 함수를 정의
def myfn(x):
    return x**2
 
# 0~1 사이에 해당 y 함수를 적분 한다.
ans, err = quad(myfn, 01)
print (ans)
cs

 

c:\python\code 폴더에 scipytest.py 라고 저장하고, 아래와 같이 실행을 하면 적분 결과를 볼수 있다.

c:\Python\code>python scipytest.py
0.5

 

 

 

 

[Sympy]

구글에서 'sympy documentation' 이라고 검색한다.

http://docs.sympy.org/latest/index.html

 

  해당 메뉴얼을 보면 보통 대수학이나 기하학에 대한 기능들이 많은데, symbolic(기호) 연산이 가능하다는 특징이 있다고 한다. 이것은 혹시 'mathematica' 라는 툴을 써본 경험이 있는 분은 알 것 같은데(전 개인적으로 좋아하는 툴이다), 마치 수학 공식을 사람이 푸는 것처럼 기호 형태로서 풀이하는 것을 얘기한다. 온라인에서 경험해 보자면, https://www.wolframalpha.com/ 페이지로 가서, 검색 란에 'y=x^2-x-6' 를 넣고 검색을 하면, 해당 함수의 그래프나, 근, 인수분해 결과 및 과정 등을 보여준다.

 

  해당 부분은 수식 계산에도 쓸수 있지만, 수학 공부 할때 병행해 이리저리 사용해도, 뭐 나쁘진 않아 보인다. 먼저 아래와 같이 설치해 본다.

c:\Python\code>pip install sympy
Collecting sympy
....
Successfully installed mpmath-0.19 sympy-1.0

 

 

  위의 wolframalpha 페이지에 넣었던 'y=x^2-x-6' 를 인수분해 하는 코드는 아래와 같다. n승 기호가 '^' 가 아닌 '**' 로 좀 다르다(이런 부분은 만드는 사람 맘대로니...)

1
2
3
4
5
6
7
8
9
#-*- coding: utf-8 -*-
from sympy import *
 
# x 를 심볼로 지정
= symbols('x')
 
# x^2-x-6 의 인수분해를 한다.
ans = factor(x**2 - x - 6)
print(ans)
cs

 

c:\python\code 폴더에 sympytest.py 라고 저장하고, 아래와 같이 실행을 하면 인수분해한 결과가 표시 된다.

c:\Python\code>python sympytest.py
(x - 3)*(x + 2)

 

 

 

 

[pandas]

마지막으로 팬더스 차례다. 마찬가지로 구글에 'pandas documentation' 라고 검색한다.

http://pandas.pydata.org/pandas-docs/stable/

 

  뭐 여기서도 여러가지 설명들이 있지만, 기본적인 기능을 보면 csv, json 등의 데이터를 url 등으로 부터 가져와서 dataframe 이라는 numpy 의 arrary 와 비슷한 저장 공간에 넣거나, 데이터의 기준이 되는 시간 데이터 등을 자동으로 생성해 주거나, 마치 DB 안의 데이터와 같이 join 이나, 정렬, 그룹핑 등이 가능하다. 실제 panda는 numpy 를 베이스로 만들어 졌다고 한다.

http://stackoverflow.com/questions/11077023/what-are-the-differences-between-pandas-and-numpyscipy-in-python 

 

  근데 SQL 문법을 아는 분은 마지막에 있는 'Comparison with SQL' 항목을 살펴보게 되면 pandas 가 무슨일을 할수 있는지를 대략적이겠지만 좀 더 쉽게 이해할 수 있게 되는 것 같다. (R을 아는 분은 R 하고의 비교 링크도 있다) 결국 개인적인 생각으로는 pandas 는 데이터 분석 작업을 위해 메모리상에 구현되 있는 엑셀과 비슷하다고 개념을 잡으면 어떨까 싶다. 엑셀의 여러 내장 함수를 조합해서 다중 배열이나, SQL 의 여러 기능들과 비슷한 작업을 할 수 있듯이, pandas 도 메모리 상에 데이터들을 정렬해 뿌려 놓고 엑셀을 조작하듯이, 해당 데이터 개개에 여러가지 numpy 와 같은 방식으로 연산을 가하거나, DB 에 저장한 데이터 같이 여러가지 조건에 의해서 분류하거나, 조합하거나, 필터링 하는것을 쉽게 해주는 라이브러리라고 생각하면 될듯 싶다.

 

 

  그럼 샘플 실행을 위해 pandas를 설치한다.

c:\Python\code>pip install pandas
Collecting pandas
...
Successfully installed pandas-0.20.1 python-dateutil-2.6.0 pytz-2017.2

 

  pandas 용 dataframe 을 하나 만들고, 그 중에서 SQL 의 where 조건을 적용한 것과 비슷하게 'A' 열이 'fruit' 인 데이터만 추출하는 예제의 코드는 아래와 같다.  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#-*- coding: utf-8 -*-
import pandas as pd
import numpy as np
 
# pandas 용 dataframe 을 만든다(메모리 버전 엑셀이라고 생각하자)
df = pd.DataFrame({'A''fruit drink cookie fruit'.split(),
                   'B''orange Coke chocopie mango'.split(),
                   'C': np.arange(4)})
 
# 만든 df 를 출력
print(df)
print('------------------------------')
 
# 뿌리면 아래와 같이 생김.
#      A         B      C
# 0  fruit    orange    0
# 1  drink    juice     1
# 2  cookie   chocopie  2
# 3  fruit     mango    3
 
# df 중에 A 열이 fruit 인 데이터만 추출
print(df.loc[df['A'== 'fruit'])
cs

 

c:\python\code 폴더에 pandatest.py 라고 저장하고, 아래와 같이 실행을 한다.

c:\Python\code>python pandatest.py
        A         B        C
0   fruit      orange    0
1   drink      Coke     1
2  cookie  chocopie   2
3   fruit     mango     3
------------------------------
       A       B      C
fruit  orange   0
fruit   mango  3

 

 

 

 

[마무리 하면서]

  위의 4개의 수학 모듈들을 살펴 보면서(사실 pandas 는 수학 모듈이라기 보단 범용 데이터 처리를 위한 공통 프레임 이라고 보는게 맞을 것 같지만...) 머신러닝이나 기타 분야에서 왜 numpy 나 pandas 같은 모듈들을 애용하는지에 대해서 공감을 가지게 됬음 하는 바램을 가진다. 참 이렇게 보면 파이썬은 여러 모듈들이 엃히고 설키면서 서로를 보조하며 시너지를 내어 더 인기가 많은 듯도 싶다. 이 시간을 진행함으로서 나중에 머신러닝에 대해서 얘기할때는 해당 코드에서 보이는 numpy 나 pandas 코드가 밥위의 콩처럼 분리되어 보여, 머신러닝 모듈 자체에만 집중 하게 되어, 좀 더 설명이 간략하게 될 거라고 기대를 하고 있다. 다음 시간에는 비슷한 목적으로 가공된 데이터를 좌표상에 표시해 주는 그래픽 라이브러리에 대해서 살펴보려고 한다.

 

 

 

 

2017.5.7 by 자유로운설탕
cs
posted by 자유로운설탕
prev 1 next