다항식 및 스플라인 보간법

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 릿지 회귀를 사용하여 특정 차수까지 다항식으로 함수를 근사하는 방법을 배웁니다. 1 차원 점 x_in_samples 개를 사용하여 이를 두 가지 다른 방법으로 보여줍니다.

  1. PolynomialFeatures: 지정된 차수까지 모든 단항식을 생성합니다. 이는 n_samples 행과 degree + 1 열을 가진 반데르몽드 행렬을 제공합니다.
  2. SplineTransformer: B-스플라인 기저 함수를 생성합니다. B-스플라인의 기저 함수는 degree + 1 개의 연속 노드 사이에서만 0 이 아닌 degree 차수의 조각별 다항식 함수입니다.

make_pipeline 함수를 사용하여 비선형 특징을 추가하고, 이러한 변환기가 선형 모델로 비선형 효과를 모델링하는 데 적합함을 보여줍니다. 다항식 특징과 B-스플라인을 사용하여 함수, 학습 점, 보간 결과를 플롯합니다. 또한 두 변환기의 모든 열을 별도로 플롯하고 스플라인의 노드를 보여줍니다. 마지막으로 주기적 스플라인의 사용을 보여줍니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접속합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업 검증은 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

데이터 준비

근사하려는 함수를 정의하고 플롯을 준비하는 것으로 시작합니다.

def f(x):
    """다항 보간으로 근사할 함수."""
    return x * np.sin(x)

## 플롯하고자 하는 전체 범위
x_plot = np.linspace(-1, 11, 100)

## 흥미를 위해 학습에 사용할 점의 작은 부분집합만 제공합니다.
x_train = np.linspace(0, 10, 100)
rng = np.random.RandomState(0)
x_train = np.sort(rng.choice(x_train, size=20, replace=False))
y_train = f(x_train)

## 변환기에 입력하기 위해 이러한 배열의 2 차원 배열 버전을 만듭니다.
X_train = x_train[:, np.newaxis]
X_plot = x_plot[:, np.newaxis]

다항 특징 보간

PolynomialFeatures를 사용하여 다항 특징을 생성하고 릿지 회귀 모델을 학습 데이터에 맞춥니다. 그런 다음 다항 특징을 사용하여 함수, 학습 점 및 보간 결과를 플롯합니다.

## 함수 플롯
lw = 2
fig, ax = plt.subplots()
ax.set_prop_cycle(
    color=["black", "teal", "yellowgreen", "gold", "darkorange", "tomato"]
)
ax.plot(x_plot, f(x_plot), linewidth=lw, label="ground truth")

## 학습 점 플롯
ax.scatter(x_train, y_train, label="training points")

## 다항 특징
for degree in [3, 4, 5]:
    model = make_pipeline(PolynomialFeatures(degree), Ridge(alpha=1e-3))
    model.fit(X_train, y_train)
    y_plot = model.predict(X_plot)
    ax.plot(x_plot, y_plot, label=f"degree {degree}")

ax.legend(loc="lower center")
ax.set_ylim(-20, 10)
plt.show()

B-스플라인 보간

SplineTransformer를 사용하여 B-스플라인 기저 함수를 생성하고 릿지 회귀 모델을 학습 데이터에 맞춥니다. 그런 다음 B-스플라인을 사용하여 함수, 학습 점 및 보간 결과를 플롯합니다.

## 4 + 3 - 1 = 6 개의 기저 함수를 갖는 B-스플라인
model = make_pipeline(SplineTransformer(n_knots=4, degree=3), Ridge(alpha=1e-3))
model.fit(X_train, y_train)

y_plot = model.predict(X_plot)
ax.plot(x_plot, y_plot, label="B-spline")
ax.legend(loc="lower center")
ax.set_ylim(-20, 10)
plt.show()

변환기 플롯

생성된 특징 기저에 대한 더 자세한 통찰력을 얻기 위해 두 변환기의 모든 열을 별도로 플롯합니다.

fig, axes = plt.subplots(ncols=2, figsize=(16, 5))
pft = PolynomialFeatures(degree=3).fit(X_train)
axes[0].plot(x_plot, pft.transform(X_plot))
axes[0].legend(axes[0].lines, [f"degree {n}" for n in range(4)])
axes[0].set_title("PolynomialFeatures")

splt = SplineTransformer(n_knots=4, degree=3).fit(X_train)
axes[1].plot(x_plot, splt.transform(X_plot))
axes[1].legend(axes[1].lines, [f"spline {n}" for n in range(6)])
axes[1].set_title("SplineTransformer")

## 스플라인의 연결점 플롯
knots = splt.bsplines_[0].t
axes[1].vlines(knots[3:-3], ymin=0, ymax=0.8, linestyles="dashed")
plt.show()

주기적 스플라인

SplineTransformer를 사용하고 노드를 수동으로 지정하여 주기적 스플라인의 사용을 보여줍니다. 릿지 회귀 모델을 학습 데이터에 맞추고 주기적 스플라인을 사용하여 함수, 학습 점 및 보간 결과를 플롯합니다.

def g(x):
    """주기적 스플라인 보간으로 근사할 함수."""
    return np.sin(x) - 0.7 * np.cos(x * 3)


y_train = g(x_train)

## 테스트 데이터를 미래로 확장:
x_plot_ext = np.linspace(-1, 21, 200)
X_plot_ext = x_plot_ext[:, np.newaxis]

lw = 2
fig, ax = plt.subplots()
ax.set_prop_cycle(color=["black", "tomato", "teal"])
ax.plot(x_plot_ext, g(x_plot_ext), linewidth=lw, label="실제 값")
ax.scatter(x_train, y_train, label="학습 점")

for transformer, label in [
    (SplineTransformer(degree=3, n_knots=10), "스플라인"),
    (
        SplineTransformer(
            degree=3,
            knots=np.linspace(0, 2 * np.pi, 10)[:, None],
            extrapolation="periodic",
        ),
        "주기적 스플라인",
    ),
]:
    model = make_pipeline(transformer, Ridge(alpha=1e-3))
    model.fit(X_train, y_train)
    y_plot_ext = model.predict(X_plot_ext)
    ax.plot(x_plot_ext, y_plot_ext, label=label)

ax.legend()
fig.show()

요약

이 실험에서 우리는 릿지 회귀를 사용하여 특정 차수까지 다항식으로 함수를 근사하는 방법을 배웠습니다. 1 차원 점 x_in_samples 개를 사용하여 이를 수행하는 두 가지 다른 방법을 보여주었습니다. make_pipeline 함수를 사용하여 비선형 특징을 추가하고, 이러한 변환기가 선형 모델로 비선형 효과를 모델링하는 데 적합하다는 것을 보여주었습니다. 다항식 특징과 B-스플라인을 사용하여 함수, 학습 점, 및 보간 결과를 플롯했습니다. 또한 두 변환기의 모든 열을 별도로 플롯하고 스플라인의 노드를 보여주었습니다. 마지막으로 주기적 스플라인의 사용을 보여주었습니다.