소프트웨어 개발/Python

Numpy 및 Scipy 시작하기,

늘근이 2015. 11. 28. 13:30

아래 내용은 building machine learning systems with python 서적을 보고 참고하며 흐름을 정리한 것이다. 굉장히 쉽고 잘되어있는 책이기 때문에 하나씩사보도록 한다.

 

Numpy 는 다차원 배열 최적화 라이브러리,

Scipy는 배열을 이용한 빠른 수치연산 기능제공을 한다.

 

Numpy를 Import할때는, 기존의 스탠다드 리스트와 헷갈리지 않기 위해

 

import

import numpy as np

 

이런식으로 import를 하도록 한다.

 

차원확인

In [13]: a = np.array([1,2,3,4,5,6])

In [14]: a
Out[14]: array([1, 2, 3, 4, 5, 6])

In [15]: a.ndim
Out[15]: 1

In [16]: a.shape
Out[16]: (6L,)

 

 

간단한 array는 위와같이 확인한다. 5개원소의 1차원 배열임을 알수있다.

이를 행렬로 바꿀수 있다.

 

리스트를 행렬로

In [18]: b
Out[18]:
array([[1, 2],
       [3, 4],
       [5, 6]])

 

 

a와 b는 같은 같은 메모리주소를 바라보고 있기 때문에 제대로 복사가 되어서 두본이 생긴게 아니다. 뒤에서는 하나의 자료를 다른방식으로 표현하고 있다.

따라서 제대로 복사하려면

 

TRUE COPY

In [19]: c = b.copy()

 

 

를 이용한다. 이제 별개의 공간을 이용한다.

 

연산자는 파이썬의 기본리스트와 다르게 다음과 같이 이용할수 있다.

 

행렬 연산

In [20]: c*2
Out[20]:
array([[ 2,  4],
       [ 6,  8],
       [10, 12]])

In [21]: c**3
Out[21]:
array([[  1,   8],
       [ 27,  64],
       [125, 216]])

 

 

만약 파이썬 연산자를 썼다면,

[1,2,3,4,5,1,2,3,4,5] 의 배열이 되었을것이다.

 

그리고 다음과 같이 조건에 따라 값을 골라낼수 있다.

 

행렬조건 (조건만족하는거 골라내기)

In [22]: c>2
Out[22]:
array([[False, False],
       [ True,  True],
       [ True,  True]], dtype=bool)

In [23]: c[c>3]
Out[23]: array([4, 5, 6])

In [24]: c[c>3] = 99

In [25]: c
Out[25]:
array([[ 1,  2],
       [ 3, 99],
       [99, 99]])

 

다음과 같이 하한선과 상한선을 같이 찝어낼수도 있다.

상.하한선

In [26]: c.clip(2,3)
Out[26]:
array([[2, 2],
       [3, 3],
       [3, 3]])

 

존재하지 않는 값 처리

np.isnan(c) // 이걸로 확인한 후,

c[~np.isnan(c)] // 이걸로 처리한다.

 

 

이제 Scipy를 가지고 실험을 해본다.

Scipy는

군집및 벡터양자화(cluster)

수학상수(constants)

이산 푸리에 변환함수 (fftpack)

적분함수(integrate),

보간법(interploate)

데이터입출력(io)

엔트로피모델(maxentropy)

이미지패키지(ndimage)

직교거리회귀(odr)

최적화(optimize)

신호처리(signal)

희소매트릭스 (sparse)

공간데이터구조 및 알고리즘(spatial)

특이수학함수(special)

통계 (stats)

를 지원한다.

다음과 같이 파일에서 값을 추출하며

 

 

Scipy 파일추출

In [40]: data = sp.genfromtxt("D:\p01\ch01\data\web_traffic.tsv", delimiter="\t")

In [41]: data
Out[41]:
array([[  1.00000000e+00,   2.27200000e+03],
       [  2.00000000e+00,              nan],
       [  3.00000000e+00,   1.38600000e+03],
       ...,
       [  7.41000000e+02,   5.39200000e+03],
       [  7.42000000e+02,   5.90600000e+03],
       [  7.43000000e+02,   4.88100000e+03]])

 

두번째열에는 nan이 존재하기 때문에 y기준으로 x데이터도 날려버리고 y데이터도 날려버릴수 있다.

다음과 같이 nan을 전처리해버리고 벡터로 쪼개버릴수 있다.

 

 

데이터 전처리 및 쪼개기

In [48]: x = data[:,0]

In [49]: y = data[:,1]

In [50]: x = x[~sp.isnan(y)]

In [51]: y = y[~sp.isnan(y)]

 

그리고 그림을 그린다.

 

 

matplotlib이용해 데이터 산점도

In [53]: plt.scatter(x,y,s=10)
Out[53]: <matplotlib.collections.PathCollection at 0x9718240>

In [54]: plt.show()

 

 

polyfit을 통하면 에러가 가장적은 직선을 하나 내준다. 그 직선과의 거리를 계산하는 방법은, (f(x) - y)^2 과 같은데, 즉 직선과 멀리떨어져있는 거리의 제곱을 해서 더한 총 값이다.

 

에러구하는 function

In [55]: def error(f, x, y):
   ....:     return sp.sum((f(x) - y)**2)
   ....:

 

Scipy의 polyfit을 이용하면 쉽게 모델함수와 잔차를 구할수 있다.

모델함수와 잔차구하기

In [57]: fp1, residuals, rank, sv, rcond = sp.polyfit(x,y,1,full=True)

In [58]: fp1
Out[58]: array([   2.59619213,  989.02487106])

 

모델 함수 fp1로 에러율 구하기

In [59]: f1 = sp.poly1d(fp1)

In [60]: print(error(f1,x,y))
317389767.34

 

모델함수 fp1은 구해져있기 때문에 이를 poly1d 함수로 만든다음 최종으로 값을 구하면 된다.

이차원은 이렇게 하면 된다.

In [62]: fp2 = sp.polyfit(x,y,2)

In [63]: fp2
Out[63]: array([  1.05322215e-02,  -5.26545650e+00,   1.97476082e+03])

In [64]: f2 = sp.poly1d(fp2)

In [65]: f2
Out[65]: poly1d([  1.05322215e-02,  -5.26545650e+00,   1.97476082e+03])

In [67]: print(error(f2,x,y))
179983507.878

 

3.5주차에 걸쳐 뭔가 데이터가 급격하게 변하기 때문에 이에 따른 선형공식을 한번 나눠본다.

 

In [91]: f = sp.poly1d(fp2)

In [93]: from scipy.optimize import fsolve

In [94]: max = fsolve(f-100000, x0=800)/(7*24)

In [95]: max
Out[95]: array([ 19.70808959])

최적화는 19.7이다.

 

아래와 같이 쓸수도 있다. fsolve를 통해 최적해를 구하기 때문에, 아래와 같이 쓸수도 있다.

 

In [98]: max = fsolve(f,800)

In [99]: max
Out[99]: array([ 249.87027654])

 

 

참고사이트는 다음과 같다.

building machine learning systems with python, 에이콘출판사

https://www.kaggle.com/

http://blog.kaggle.com

http://metaoptimize.com/qa

freenode - #machinelearning