아래 내용은 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]: 1In [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, 에이콘출판사
freenode - #machinelearning
'소프트웨어 개발 > Python' 카테고리의 다른 글
Microsoft Visual C++ 9.0 is required. (0) | 2015.12.01 |
---|---|
파이썬으로 간단한 실제 분류기 만들기 (0) | 2015.11.28 |
pickle을 이용한 간단한 데이터 저장. (0) | 2015.10.03 |
일반인을 위한 머신러닝(5) - 파이썬 다뤄보기 (0) | 2015.08.22 |
django ajax (0) | 2015.04.27 |