[딥러닝]Spline 함수

Date:     Updated:

카테고리:

Spline의 정의

Spline은 주어진 데이터 점들을 부드럽게 연결하는 함수이다. 대표적으로는 B-splineCubic spline이 많이 사용된다. Cubic spline은 주어진 점들 사이에서 3차 다항식을 사용하여 각 구간마다 곡선을 정의하는 방법이다.

  • 연속성: 각 구간에서 곡선이 연결될 때, 1차 및 2차 미분값이 연속적이도록 만들어 부드러운 곡선을 형성한다.
  • 다차원 함수: 일반적으로 구간별로 다항식으로 정의되며, 데이터 점의 개수에 따라 다양한 차수를 가진 스플라인을 정의할 수 있다.

B-Spline

B-spline은 Spline의 일종으로, 각 구간에서 다항식을 사용하여 곡선을 구성하지만, B-spline은 특히 basis function이라는 개념을 사용하여 전체 곡선을 표현한다.

  • 기저 함수: B-spline은 기저 함수(basis function)를 사용해 곡선을 구성한다. 이를 통해 곡선의 일부를 변화시켜도 전체 곡선에 크게 영향을 주지 않도록 설계할 수 있다.
  • 국소성: B-spline은 국소적인 특성을 가지고 있어, 특정 구간에서 데이터나 곡선을 조정해도 다른 구간에는 큰 영향을 미치지 않는다.
  • 정확한 제어: 제어점을 통해 곡선의 모양을 세밀하게 조정할 수 있다.
  • 다양한 차수: B-spline은 차수를 조정할 수 있어 선형, 2차, 3차 등 다양한 형태의 곡선을 생성할 수 있다.

B-spline은 각 구간마다 정의된 basis function (기저 함수)의 선형 결합으로 구성된 곡선이다. B-spline은 차수 \(k\)와 매듭점(knots)에 따라 정의되며, 각 구간에서의 곡선은 이 기저 함수들의 가중합으로 표현된다. B-spline에서 가장 중요한 것은 기저 함수 \(N_{i,k}(x)\)로, 이는 각 구간에서 국소적으로 정의된다. 정리하면, 스플라인은 주어진 데이터 점을 부드럽게 연결하는 방법이며, B-spline은 이를 좀 더 세밀하게 제어할 수 있는 스플라인의 확장 개념이다. B-spline은 곡선을 국소적으로 제어하는데 유리한 기법이다.

차수 \(k\)인 B-spline 함수는 다음의 재귀적 방식으로 정의된다.

[차수 \(k=0\)일 때]

$$ N_{i,0}(x) = \begin{cases} 1, & \text{if } t_i \leq x < t_{i+1} \\ 0, & \text{otherwise} \end{cases} $$

[차수 \(k>0\)일 때]

$$ N_{i,k}(x) = \frac{x - t_i}{t_{i+k} - t_i} N_{i,k-1}(x) + \frac{t_{i+k+1} - x}{t_{i+k+1} - t_{i+1}} N_{i+1,k-1}(x) $$

여기서 \(t_i\)는 매듭점(knots)을 나타낸다. 이러한 방식으로 정의된 기저 함수들을 선형 결합하여 곡선을 정의한다.

$$ S(x) = \sum_{i=0}^{n} c_i N_{i,k}(x) $$

여기서 \(c_i\)는 제어점의 계수이고, \(N_{i,k}(x)\)는 각 구간에서의 B-spline 기저 함수이다.

Cubic Spline (3rd Spline)

Cubic spline은 구간별로 3차 다항식으로 정의된 스플라인이다. \(n+1\)개의 데이터 점 \((x_0, y_0), (x_1, y_1), \dots, (x_n, y_n)\)이 주어졌다고 하자. 각 구간 \([x_i, x_{i+1}]\)에서의 스플라인은 3차 다항식으로 표현된다.

$$ S_i(x) = a_i + b_i (x - x_i) + c_i (x - x_i)^2 + d_i (x - x_i)^3, \quad x \in [x_i, x_{i+1}] $$

여기서 \(a_i, b_i, c_i, d_i\)는 각 구간에 대한 다항식의 계수들이다. 이 계수들은 다음의 조건에 따라 결정된다.

  1. 각 스플라인 함수는 데이터 점을 지나가야 한다.
$$ S_i(x_i) = y_i \quad \text{and} \quad S_i(x_{i+1}) = y_{i+1} $$
  1. 각 구간의 스플라인 함수는 1차 미분과 2차 미분이 연속적이어야 한다.
$$ S_i'(x_{i+1}) = S_{i+1}'(x_{i+1}), \quad S_i''(x_{i+1}) = S_{i+1}''(x_{i+1}) $$
  1. 자연 경계 조건 (Natural Boundary Condition): 스플라인의 양 끝에서 2차 미분값이 0이 된다.
$$ S_0''(x_0) = 0 \quad \text{and} \quad S_n''(x_n) = 0 $$

위의 조건들을 이용하여 각 구간의 계수 \(a_i, b_i, c_i, d_i\)를 결정할 수 있다.

  • B-Spline vs Cubic Spline
    • Cubic spline은 구간마다 3차 다항식을 사용해 데이터를 부드럽게 연결하고, 모든 구간에서 미분이 연속적이다.
    • B-spline은 국소적으로 정의된 기저 함수들의 선형 결합으로 곡선을 구성하며, 제어점의 변화를 국소적으로 조정할 수 있다. 이 두 가지 방식 모두 데이터를 근사하거나 보간할 때 자주 사용되지만, B-spline은 특히 복잡한 곡선을 더 세밀하게 제어할 수 있는 장점이 있다.

Python 구현

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d, make_interp_spline

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([0, 0.5, 0.9, 0.4, -0.1, -0.6, 0.2, 0.7, -0.2, -0.9])

cubic_spline = interp1d(x, y, kind='cubic') # Cubic Spline
b_spline = make_interp_spline(x, y, k=2)  # Basis Spline

x_new = np.linspace(0, 9, 200)
y_cubic = cubic_spline(x_new)
y_b_spline = b_spline(x_new)

plt.plot(x, y, 'o', label='Data points', color='black')
plt.plot(x_new, y_cubic, '-', label='Cubic Spline', color='blue')
plt.plot(x_new, y_b_spline, '--', label='B-Spline', color='red')

plt.legend()
plt.title("Cubic Spline vs B-Spline Interpolation (Complex Data)")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

1

DeepLearning 카테고리 내 다른 글 보러가기

댓글 남기기