interpolate : Interpolation and smoothing splines
→ 보간법: 몇 개의 샘플 포인트들로 추정하여 인접한 점들 사이를 다항식 함수로 이어준 것에서 미싱포인트(추정)들을 계산/추정하는 방법이다.
- interp.interp1d vs. interp.interp2d: 입력 데이터 차원이 다르고 서로 다른 보간 방식을 지원함(interp2d는 바이리니얼(bi-linear) 보간 방법을 사용)
- interp1d의 kind 옵션: 보간법을 선택할때 사용
1) linear: 선형보정 → 데이터를 직선으로 연결
2) nearest: 가장 가까운 이웃 값
3) zero: 0차 다항식(0차 스플라인)
4) slinear: 선형 스플라인(1차 다항식)
5) quadratic: 2차 스프라인(다항식)
6) cubic: 3차 스플라인(다항식)
7) previous: 주어진 데이터 포인트 중 바로 앞의 값
8) next: 주어진 데이터 포인트 중 바로 뒤의 값
optimize : Optimization and root-finding routines
→ 다양한 최적화 알고리즘과 관련 도구를 제공하는 모듈: 그래디언트 계산, 자코비안 행렬 계산, Hessian 행렬 계산, 함수 값 캐싱 등 가능
1) minimize_scalar: 단일 변수 최적화
2) minimize: 다변수 최적화 / constraint 변수를 사용해 제약 조건 최적화를 가능케 함
3) basinhopping: 전역 최적화
import matplotlib.pyplot as plt
def f(x):
return x**4 -10*x**2
plt.plot(x,f(x));
plt.plot(x_opt,f(x_opt),'ro');
위와 같은 코드를 돌리면 아래와 같이 다변수 최적화가 된다.
- optimize.curve_fit(): 주어진 모델 함수와 데이터를 기반으로 파라미터 추정(parameter estimation)을 수행
import matplotlib.pyplot as plt
def f(x,a,b):
return a*x +b
x_fine = np.linspace(-2,2,200)
plt.plot(x_fine,f(x_fine,a,b))
plt.plot(x,y,'ro')
def g(x,a,b):
return a*x +b*np.sin(6.5*x)
x_fine = np.linspace(-2,2,200)
plt.plot(x_fine,g(x_fine,a,b))
plt.plot(x,y,'ro')
순서대로 출력 값을 정리하였는데, 함수에 따라 추정이 달라짐을 알 수 있다.
stats : Statistical distributions
→ 다양한 확률 분포와 통계적 함수를 제공
- stats.kde.gaussian_kde(): 커널 밀도 추정(Kernel Density Estimation, KDE)을 수행하는 기능을 제공
integrate : Integration and ordinary differential equation solvers
→ 수치적 적분(numerical integration)을 수행하는 함수와 도구를 제공
- quad: 단일 변수 정적분
- dblquad: 다변수 정적분
- quadpack: 수치 적분 도구
- odein: 미분방정식 초기값 문제를 수치적으로 해결하는 함수
- fft/ifft: 푸리에 변환과 역변환을 수행하는 함수
networkx: 그래프와 네트워크를 구축하고 분석하기 위한 강력한 라이브러리
- 노드와 엣지를 추가하여 유향 그래프, 무향 그래프, 가중치 그래프 등 다양한 유형의 그래프를 생성하고 조작할 수 있다.
- 네트워크 구조를 분석하고 특성을 추출하는데 유용
- 시각화 기능 제공
import networkx as nx
G = nx.Graph()
G.add_nodes_from([1,2,3,4])
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,1)
G.add_edge(3,4)
G = nx.complete_graph(10)
nx.draw(G)
for idx,val in s.iteritems(): #python3에서는 .items() 사용
print(idx,val)
'''
결과값:
a -0.8467049357276993
b 0.7257672552631623
c 0.3685608531494231
d -0.8934624479869832
e 12.0
'''
s = pd.Series([0,0,0,1,1,1,2,2,2,2])
sct = s.value_counts() # what is the type of sct?
print(sct)
type(sct)
'''
결과값:
2 4
0 3
1 3
dtype: int64
pandas.core.series.Series
'''
# Create a dictionary of series
d = {'one': pd.Series([1,2,3], index = ['a', 'b', 'c']),
'two': pd.Series(list(range(4)), index = ['a','b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df, end = end_string)
'''
one two
a 1.0 0
b 2.0 1
c 3.0 2
d NaN 3
'''
d= {'one': {'a': 1, 'b': 2, 'c':3},
'two': pd.Series(list(range(4)), index = ['a','b', 'c', 'd'])}
# Columns are dictionary keys, indices and values obtained from series
df = pd.DataFrame(d)
# Notice how it fills the column one with NaN for d
print(df, end = end_string)
'''
one two
a 1.0 0
b 2.0 1
c 3.0 2
d NaN 3
'''
d = {'one': pd.Series([1,2,3], index = ['a', 'b', 'c']),
'two': pd.Series(list(range(4)), index = ['a','b', 'c', 'd'])}
print(pd.DataFrame(d, index = ['d', 'b', 'a']), end = end_string)
print(pd.DataFrame(d, index = ['d', 'b', 'a'], columns = ['two', 'three']),
end = end_string)
'''
one two
d NaN 3
b 2.0 1
a 1.0 0
-------------
two three
d 3 NaN
b 1 NaN
a 0 NaN
'''
pd.date_range('1/1/2000', periods=8)
X = df[['weight']].to_numpy() #2차원 리스트
y = df['rings'].to_numpy()
from sklearn import linear_model
model = linear_model.LinearRegression()
model.fit(X, y)
print(model.coef_, model.intercept_)
''' 출력
[3.55290921] 6.989238807755703
'''
print(model.score(X, y))
''' 출력
0.29202100292591804
'''
for name in iris.target_names:
plt.scatter(X[y == name, 0], X[y == name, 1], label=name)
주성분 분석(Principal Component Analysis, PCA): PCA는 데이터의 분산을 최대로 보존하는 주요한 축을 찾아서 차원을 축소한다.
선형 판별 분석(Linear Discriminant Analysis, LDA): LDA는 지도학습에서 차원 축소를 수행하는 방법으로 클래스 간 분산과 클래스 내 분산의 비율을 최대화하는 축을 찾아서 데이터를 변환한다.
→ 데이터를 특정 한 축에 사영(projection)한 후에 두 범주(빨간색, 파란색)을 잘 구분할 수 있는 직선을 찾는 것이 목표
t-SNE(t-Distributed Stochastic Neighbor Embedding): t-SNE는 고차원 데이터의 시각화를 위해 사용되는 비선형 차원 축소 알고리즘이다.
특이값 분해(Singular Value Decomposition, SVD): SVD는 행렬을 저차원의 근사 행렬로 분해하는 기법으로 행렬 분해를 통해 주요한 특성을 추출한다.
→ 특이값 분해는 정방 행렬뿐만 아니라 행과 열의 크기가 다른 행렬에 대해서도 적용
- 행렬 U와 V에 속한 벡터를 특이 벡터(Singular Vector)라 한다. 모든 특이 벡터는 서로 직교한다.
- ∑는 직사각 대각 행렬이며, 행렬의 대각에 위치한 값만 0이 아니고 나머지 위치의 값은 모두 0이다. ∑의 0이 아닌 대각 원소값을 특이값(Singular Value)이라고 한다.
- U와 V에 속한 열 벡터를 특이 벡터(Singular Vector)라 한다. U에 속한 벡터를 Left Singular Vector, V에 속한 벡터를 Right Singular Vector라고 한다.
→ 선형 변환 A 후에도 그 크기는 ∑만큼 변하지만 여전히 직교하는 벡터를 만든다.
LLE(Locally Linear Embedding): LLE는 비선형 차원 축소 알고리즘으로, 지역적으로 선형인 패턴을 보존하는 방식으로 데이터를 저차원으로 매핑한다.
→ 거리를 추정할 필요가 없고, 국소적인 선형 적합으로 부터 전역적인 비선형 구조를 복원한다.
(1단계) 각 데이터 점의 이웃을 선택 (Select neighbors)
(2단계) 이웃으로부터 선형적으로 가장 잘 재구성하는 가중치를 계산 (Reconstruct with linear weights)
(3단계) 가중치를 사용해 저차원의 임베딩 좌표로 매핑 (Map to embedded coordinates)
A_gpu = A.to(gpu) #데이터를 GPU로 보냄: 데이터를 GPU로 복사
B_gpu = B.to(gpu)
A_gpu@B_gpu
'''출력
tensor([[22.1136, 23.1953, 23.0761, ..., 22.0609, 22.9691, 22.4580],
[22.3957, 22.2071, 23.4089, ..., 22.1435, 23.8955, 24.0480],
[25.7805, 23.3261, 24.7989, ..., 22.4402, 25.1166, 24.7828],
...,
[21.5669, 22.1809, 21.5585, ..., 22.0518, 23.5019, 23.3384],
[26.2310, 27.7557, 26.9037, ..., 25.7191, 25.0999, 26.4186],
[26.2045, 26.5745, 25.8596, ..., 24.5887, 22.8976, 25.9937]],
device='cuda:0')
'''
A@B_gpu
'''출력
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-7-c90cee74ed92> in <cell line: 1>()
----> 1 A@B_gpu
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument mat2 in method wrapper_CUDA_mm)
'''
x = torch.tensor([2.0])
m = torch.tensor([5.0], requires_grad = True)
c = torch.tensor([2.0], requires_grad = True)
y = m*x + c
loss = torch.norm( y - 13)
loss.backward()
Activation function
1) 시그모이드 함수(Sigmoid function): 시그모이드 함수는 실수 입력을 0과 1 사이의 값으로 압축하는 S자 모양의 함수이며 주로 이진 분류 문제에서 사용된다.
→ torch.sigmoid()로 구현가능
2) 하이퍼볼릭 탄젠트 함수(Hyperbolic tangent function): 하이퍼볼릭 탄젠트 함수는 실수 입력을 -1과 1 사이의 값으로 압축하는 함수이며 다양한 종류의 신경망에서 사용된다.
→ torch.tanh()로 구현가능
3) ReLU 함수(Rectified Linear Unit, ReLU): ReLU 함수는 음수 입력을 0으로 변환하고 양수 입력은 그대로 유지하는 함수로 주로 은닉층에서 사용되며, 비선형성을 추가하면서도 연산이 간단하고 계산량이 작기 때문에 많이 쓰인다.
→ torch.relu()로 구현가능
4) 소프트맥스 함수(Softmax function): 소프트맥스 함수는 주로 다중 클래스 분류 문제에서 사용되며, 각 클래스에 대한 확률 분포를 출력하기 위해 사용된다. 소프트맥스 함수는 입력 벡터의 각 요소를 양수로 변환하고, 합이 1이 되도록 정규화한다.
→ torch.softmax()로 구현가능
잘 읽고 갑니다 좋은 글이네요!!