이번 글 또한 내용 공유의 목적이 아닌 scikit-learn 라이브러리에 대해 언제든 내용을 확인할 수 있게 만든 노트 목적의 글입니다.
다른 분들도 필요하다면 언제든 참고하셔도 좋습니다.
scipy란?
SciPy는 파이썬을 위한 오픈 소스 라이브러리로, 과학 기술 계산을 위한 다양한 수치 알고리즘과 도구를 제공합니다.
수치적 선형 대수, 통계, 최적화, 신호 처리 등 다양한 과학적 계산 작업을 수행하는 데 유용합니다.
역사 및 배경
SciPy는 2001년 Travis Oliphant와 다른 기여자들에 의해 시작되었습니다.
NumPy와 긴밀히 연동되며, 특히 과학 및 공학 분야의 연구자와 개발자들 사이에서 널리 사용되고 있습니다.
설치 방법
SciPy은 pip을 통해 간단하게 설치할 수 있습니다.
다음 명령어를 통해 설치할 수 있습니다.
pip install scipy
# Anaconda 배포판을 사용하는 경우
conda install scipy
의존성 패키지 :
SciPy는 NumPy에 의존하며, NumPy 배열을 기반으로 다양한 수치 계산을 수행합니다.
주요 기능
SciPy는 일반적으로 특정 알고리즘보다는 다양한 과학적 계산 및 수치 해석 작업을 수행하는 데 필요한 함수와 도구를 제공하는 라이브러리입니다.
SciPy가 제공하는 주요 기능과 관련된 알고리즘들을 구체적으로 나열할 수는 있지만, 주요 기능에 대해서만 자세히 설명하겠습니다.
선형 대수
- 선형 방정식: 선형 시스템을 풀기 위한 함수 (예: scipy.linalg.solve)를 제공합니다.
- LU 분해 (LU Decomposition): scipy.linalg.lu는 행렬을 하삼각 행렬(L)과 상삼각 행렬(U)로 분해합니다.
- QR 분해 (QR Decomposition): scipy.linalg.qr는 행렬을 직교 행렬(Q)과 상삼각 행렬(R)로 분해합니다.
- 특이값 분해 (Singular Value Decomposition): scipy.linalg.svd는 행렬을 U, Σ, V^T로 분해합니다.
- 행렬 고유값 (Eigenvalues and Eigenvectors): scipy.linalg.eig는 행렬의 고유값과 고유벡터를 계산합니다.
최적화
- 단일 변수 함수 최적화: scipy.optimize.minimize_scalar는 단일 변수 함수의 최솟값을 찾습니다.
- 다변수 함수 최적화: scipy.optimize.minimize는 다변수 함수의 최솟값을 찾습니다. 다양한 알고리즘이 사용될 수 있으며, 예를 들어 BFGS, Nelder-Mead, Powell 등이 있습니다.
- 방정식 풀이 (Root Finding): scipy.optimize.root는 비선형 방정식의 근을 찾습니다. 예를 들어, Broyden, Hybr 등 알고리즘을 사용합니다.
특징 선택
- SelectKBest: 상위 k개의 특징을 선택합니다.
- RFE (Recursive Feature Elimination): 반복적으로 특징을 제거하여 최적의 특징 집합을 선택합니다.
통계
- 기본 통계량: 평균, 표준편차, 분산 등 기본적인 통계량을 계산하는 함수 (scipy.stats.describe)를 제공합니다.
- 확률 분포: 다양한 확률 분포를 모델링할 수 있습니다. 예를 들어, scipy.stats.norm은 정규 분포, scipy.stats.expon은 지수 분포를 나타냅니다.
- 가설 검정 (Hypothesis Testing): scipy.stats.ttest_ind는 독립 표본 t-검정을 수행합니다. scipy.stats.chisquare는 카이제곱 검정을 수행합니다.
- 피팅 (Fitting): scipy.stats.linregress는 선형 회귀를 수행합니다.
신호 처리
- 필터 설계 및 적용: scipy.signal.butter는 Butterworth 필터를 설계합니다. scipy.signal.lfilter는 필터를 신호에 적용합니다.
- 주파수 분석: scipy.fftpack.fft는 고속 푸리에 변환을 수행하여 주파수 도메인으로 변환합니다.
미적분
- 수치 적분: scipy.integrate.quad는 수치 적분을 수행합니다. 예를 들어, 구간 [a, b]에서 함수를 적분합니다.
- 상미분 방정식 풀이 (Solving ODEs): scipy.integrate.solve_ivp는 초기값 문제를 푸는 상미분 방정식 솔버입니다.
인터폴레이션 (Interpolation)
- 1차원 인터폴레이션: scipy.interpolate.interp1d는 1차원 데이터에 대해 선형, 다항식 등의 인터폴레이션을 수행합니다.
- 2차원 및 다차원 인터폴레이션: scipy.interpolate.griddata는 다차원 데이터를 위한 인터폴레이션을 수행합니다.
공간 알고리즘 (Spatial Algorithms)
- 최근접 이웃 (Nearest Neighbors): scipy.spatial.cKDTree는 k-d 트리를 사용하여 최근접 이웃을 찾습니다.
- 볼록 껍질 (Convex Hull): scipy.spatial.ConvexHull는 점들의 집합에 대해 볼록 껍질을 계산합니다.
- 델로네 삼각분할 (Delaunay Triangulation): scipy.spatial.Delaunay는 2D 또는 3D 공간에서 점들의 삼각분할을 계산합니다.
import numpy as np
from scipy import linalg, optimize, stats, signal, integrate, interpolate, spatial
# 선형 대수 예제: LU 분해
A = np.array([[3, 2], [1, 4]])
P, L, U = linalg.lu(A)
print("L:\n", L)
print("U:\n", U)
# 최적화 예제: 함수의 최솟값 찾기
def f(x):
return x**2 + 5*np.sin(x)
result = optimize.minimize(f, x0=0)
print("Minimum of the function:", result.x)
# 통계 예제: t-검정
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(0.5, 1, 100)
t_stat, p_value = stats.ttest_ind(data1, data2)
print("T-statistic:", t_stat, "P-value:", p_value)
# 신호 처리 예제: Butterworth 필터 적용
b, a = signal.butter(3, 0.05)
x = np.sin(2 * np.pi * 0.75 * np.arange(100)) + np.random.normal(size=100)
y = signal.lfilter(b, a, x)
# 미적분 예제: 수치적 적분
result, error = integrate.quad(lambda x: x**2, 0, 1)
print("Integral of x^2 from 0 to 1:", result)
# 인터폴레이션 예제: 1차원 인터폴레이션
x = np.linspace(0, 10, 10)
y = np.sin(x)
f = interpolate.interp1d(x, y)
y_interp = f(np.linspace(0, 10, 50))
# 공간 알고리즘 예제: 최근접 이웃
points = np.random.rand(10, 2)
tree = spatial.cKDTree(points)
dist, idx = tree.query([0.5, 0.5])
print("Nearest point index:", idx, "Distance:", dist)
간단한 예제
간단한 예제를 통해 SciPy의 사용 방법을 설명하려고 합니다.
예시로 선형 방정식을 풀고, 함수의 최솟값을 찾고, 수치적 적분을 수행하는 방법을 설명하겠습니다.
import numpy as np
from scipy import linalg, optimize, integrate
# 선형 방정식 풀기
A = np.array([[3, 2], [1, 4]])
b = np.array([5, 6])
x = linalg.solve(A, b)
print(f"Solution of linear system: {x}")
# 함수의 최솟값 찾기
def f(x):
return x**2 + 5*np.sin(x)
result = optimize.minimize(f, x0=0)
print(f"Minimum of the function: {result.x}")
# 수치적 적분
result, error = integrate.quad(lambda x: x**2, 0, 1)
print(f"Integral of x^2 from 0 to 1: {result}")
고급 기능
상미분 방정식 풀기
SciPy는 상미분 방정식을 풀기 위한 다양한 함수를 제공합니다.
예를 들어, solve_ivp를 활용하여 초기값 문제를 해결할 수 있습니다.
from scipy.integrate import solve_ivp
def dydt(t, y):
return -2 * y
solution = solve_ivp(dydt, [0, 5], [1])
print(f"Solution of ODE: {solution.y}")
참고 자료 및 학습 리소스
공식 문서
SciPy의 공식 문서는 다양한 함수와 모듈에 대한 상세한 설명과 예제를 제공합니다.
튜토리얼 및 가이드
- SciPy 튜토리얼: 공식 튜토리얼 페이지로, SciPy의 주요 기능에 대한 단계별 가이드를 제공합니다.
- Kaggle: 다양한 과학 계산 문제와 해결 방법을 학습할 수 있는 플랫폼입니다.
- DataCamp: SciPy를 포함한 다양한 데이터 과학 강좌를 제공합니다.
감사합니다!
'프로그래밍 언어 > Python' 카테고리의 다른 글
[파이썬] 파이썬에서는 어떤 연산자들을 사용할까? (0) | 2024.12.02 |
---|---|
[파이썬 개념 정리 17] scikit-learn 라이브러리 (0) | 2024.08.02 |
[파이썬 개념 정리 16] Pandas의 DataFrame 마스터하기 6️⃣ (그룹별로 분석하기) (0) | 2024.08.01 |
[파이썬 개념 정리 15] Pandas의 DataFrame 마스터하기 5️⃣ (데이터 합치기) (0) | 2024.08.01 |
[파이썬 개념 정리 14] Pandas의 DataFrame 마스터하기 4️⃣ (날짜와 시간 데이터 다루기) (0) | 2024.07.31 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!