본문 바로가기
파이썬 (Python)/Scipy

Python 파이썬 Deep Learning 수학적 계산을 위해 꼭 필요한 라이브러리 scipy + scipy를 이용한 적분, 선형대 해 구하기

by ★√★ 2021. 1. 31.

안녕하세요, Davey 입니다. 오늘 포스팅 할 내용은, python의 하나의 라이브러리로, scipy에 대한 내용을 기재하려고 합니다. scipy 에 대한 간단한 소개와 여러가지 Method 중에 기본적인 것 부터 설명 해드리도록 하겠습니다.

 

1. Scipy 라이브러리

: Scipy은 Python 라이브러리의 하나로서, 통계, 선형대 계산 등을 위해 사용하여, 연계하는 라이브러리로는, NumPy, Matplotlib, pandas, SymPy 가 있습니다. 모델링을 최적화 하기 위해, Tensorflow도 먼저 사용해서, 모델링을 도출하여, Scipy로 넘어가는 경우도 있습니다. Scipy와 관련된, Sub Package는 아래와 같습니다.

[참조 : https://datascienceschool.net/view-notebook/175522b819ae4645907179462dabc5d4/]

 

1) scipy.cluster : 군집

2) scipy.stats : 통계 Statistics

3) scipy.constants : 물리/수학 상수 Physical and mathematical constants

4) scipy.special : 수학 함수 Any special mathematical functions

5) scipy.linalg : 선형 대수 Linear algebra routines

6) scipy.interpolate : 보간 Interpolation

7) scipy.optimize : 최적화 Optimization

8) scipy.fftpack : 이산 푸리의 변환Fast Fourier transforms

 

2. Scipy를 활용하기

  1) Scipy를 이용하여, 적분 하기 - scipy integrate, scipy.integrate.quad

 : Scipy 라이브러리를 이용하여, 적분을 쉽게 구현 할 수 있습니다. 하나의 예제를 통해서, 적분을 하는 걸 구현해보도록 하겠습니다.

 

================================================================================

 

import scipy as sp

import scipy.integrate as integrate

 

def test(x):

    return x**3 + 4

 

result01 = integrate.quad(test,0,1)

 

 

#result01[1] 의 값은 결과 값에 대한 예상 절대 에러값 (An estimate of the absolute error in the result.)

[참조 : https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quad.html ]



#result01[0] 값이 진짜 값임.

print(result01)





import scipy.integrate as integrate

 

def test(x):

    return x**2

 

result01 = integrate.quad(test,0,1)

 

print(result01)

 

================================================================================

 

- 위 코드를 실행 시켜 보면 아래와 같은 결과를 보실 수 있습니다. 위에서 설명 했듯이, 2개의 값이 도출이 되는데, 이 2개의 값 중에, 첫 번째 값이 진짜 값이고, 2번 째 같은, 결과 값에 대한 예상 절대 에러값 (An estimate of the absolute error in the result.) 이라고 합니다. 그래서 result01[0] 부분만 신경쓰시면 될 거 같습니다.

 

 

 2) Scipy를 이용하여, 선형대 해를 구하기 - scipy integrate, sp.linalg.solve

 : Scipy 라이브러리를 이용하여, 선형대의 해의 값을 쉽게 구현 할 수 있습니다. 하나의 예제를 통해서, 선형대 해를 구하는 것을 구현해보도록 하겠습니다. 아래 code는 가장 간단한, y = ax + b 의 해를 구하는 것을 구현해보도록 하겠습니다. 여기에서, 구하는 값은, "x" 와 "b" 의 값입니다. 즉, y 와 a 의 값은 주어지는 거죠. 

 

================================================================================

 

import scipy as sp
import scipy.integrate as integrate

Test1 = sp.array([[1,2,3], [5,6,7], [9,10,11]])  # a 의 행렬 값
Test2 = sp.array([1,2,3])                         # y 의 행렬 값

print("Test1 의 구성 값은 \n: ", Test1)      # a 의 행렬 값을 보여줌
print("Test2 의 구성 값은 \n: ", Test2)      # y 의 행렬 값을 보여줌

Answer1 = sp.linalg.solve(Test1,Test2)

print("Test1 & Test2 의 선형대의 해 값은 \n: ",Answer1) # x, b 의 값을 도출함.

 

================================================================================

 

- 위 코드를 실행 시켜 보면, 아래와 같이 결과를 보고, 해의 값이 도출이 되는 걸 확인 하실 수 있습니다. 여기에서 빨간색으로 "result may not be accurate. Answer1 = sp.linalg.solve(Test1,Test2)" 라고 나오는 데, 이 부분은, a 와 y의 값을 부여 할 때, 딱 떨어지는 해가 나오지 않게 입력해서 이런 결과가 나오는 걸로 알고 있습니다. 

 

 

- 그럼 딱 떨어지는 해의 a 와 y의 값을 주었을 때 어떻게 나오는지 확인 해보도록 하겠습니다.

 

================================================================================

 

import scipy as sp

import scipy.integrate as integrate

 



Test1 = sp.array([[1,2], [2,3]])           

Test2 = sp.array([1,2])

 

print("Test1 의 구성 값은 \n: ", Test1)

print("Test2 의 구성 값은 \n: ", Test2)

 

Answer1 = sp.linalg.solve(Test1,Test2)

 

print("Test1 & Test2 의 선형대의 해 값은 \n: ",Answer1)

 

================================================================================

 

- 위에서 설명 드린 대로, 바로 해가 나오는 code를 설정해 보면, 아래와 같이 Warning Message가 안 나오는 걸 보실 수 있습니다. 즉, 해가 딱 떨어지지 않고, 부정확한 결과가 나올 때 Warning Message가 나오는 걸 확인 하실 수 있습니다.

 

3) Scipy를 이용하여, 역행렬 함수 구하기 - scipy integrate, sp.linalg.inv

 : Scipy 라이브러리를 이용하여, 선형대의 해의 값을 구하는 건 위에서 확인을 하였습니다. 하지만, 위에 2번 방법으로만 해를 구하지는 않고, 역행렬을 이용해서 해를 구할 수 도 있습니다. 그래서, 3번째 항목은 역행렬을 구현하는 것을 표현해보도록 하겠습니다. 표현과 동시에, 해도 도출하는 것도 구현 해보도록 하겠습니다.  

 

================================================================================

 

import scipy as sp
import scipy.integrate as integrate

Test1 = sp.array([[1,2], [2,3]])
Test2 = sp.array([1,2])

Inverse01 = sp.linalg.inv(Test1)  # Test1의 역행렬을 구함

print("Test1의 역행렬은 \n : ", Inverse01)

print()

result01 = Test2.dot(Inverse01)   # Test2 x Test1의 역행렬을 구함.

print("역행렬로 구한, Test1 & Test2 의 선형대의 해 값은 \n:", result01)  # 역행렬을 이용해서 구한 해를 출력함.

 

================================================================================

 

- 위 코드를 실행 시켜보면 아래와 같이, 역행렬을 이용해서 구한 해가 출력되는 걸 확인 하 실 수 있습니다. 즉, 한가지가 아니고, scipy의 라이브러리를 이용해서, 여러가지 방법으로 해를 도출 할 수 있습니다.

 

 

이상입니다. 오늘은, scipy에 대해서, 간단하게 어떤 것인지에 대해서 설명을 드렸고, 그 scipy를 이용하여 구현할 수 있는 기본적인 3가지의 기능을 설명해 드렸습니다. 추가적인 포스팅이 필요할 것으로 판단되어, 추후 추가적인 포스팅으로 다른 기능도 쉬운 이해를 돕기 위해, 예제를 준비하여, 포스팅 하도록 하겠습니다. 제가 오늘 설명 드린 내용은 정말 기초적인 기능이고, 그 외에도 복잡한 수학적 계산 기능도 있으니, 구글을 통해서, 미리 접해보시는 것을 추천 드립니다. 그럼 항상 말씀 드리지만, 같이 공부하면서, 같이 성장하시죠! 감사합니다. 

 

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다. 

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab