{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "outputs": [],
      "source": [
        "# Part 7.1: 순환 신경망 (RNN) 실습\n",
        "\n",
        "이 노트북에서는 **순환 신경망(Recurrent Neural Networks, RNN)**을 활용하여 시계열 데이터 예측을 실습합니다.\n",
        "\n",
        "## 학습 목표\n",
        "- RNN의 기본 개념과 구조 이해\n",
        "- LSTM(Long Short-Term Memory) 학습\n",
        "- 시계열 데이터 전처리 방법\n",
        "- 시계열 예측 모델 구현 및 평가\n",
        "\n",
        "## 실습 내용\n",
        "1. 시계열 데이터 생성 및 전처리\n",
        "2. 기본 RNN 모델 구현\n",
        "3. LSTM 모델 구현\n",
        "4. 모델 훈련 및 예측 성능 비교\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 필요한 라이브러리 import\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.preprocessing import MinMaxScaler\n",
        "from sklearn.metrics import mean_squared_error, mean_absolute_error\n",
        "import math\n",
        "\n",
        "print(f\"PyTorch 버전: {torch.__version__}\")\n",
        "print(\"라이브러리 import 완료!\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "## 1. 시계열 데이터 생성 및 전처리\n",
        "\n",
        "사인 함수를 기반으로 한 시계열 데이터를 생성하고 RNN 모델 학습에 적합한 형태로 전처리합니다.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 시계열 데이터 생성 (사인 함수 + 노이즈)\n",
        "def create_time_series_data(seq_length=1000, noise_level=0.1):\n",
        "    \"\"\"시계열 데이터 생성 함수\"\"\"\n",
        "    t = np.linspace(0, 4*np.pi, seq_length)\n",
        "    # 기본 사인파 + 느린 주기의 사인파 + 노이즈\n",
        "    data = np.sin(t) + 0.5*np.sin(t/2) + noise_level*np.random.randn(seq_length)\n",
        "    return data\n",
        "\n",
        "# 데이터 생성\n",
        "data = create_time_series_data(seq_length=1000, noise_level=0.1)\n",
        "\n",
        "# 데이터 시각화\n",
        "plt.figure(figsize=(12, 6))\n",
        "plt.plot(data[:200])  # 처음 200개 포인트만 시각화\n",
        "plt.title('생성된 시계열 데이터 (처음 200개 포인트)')\n",
        "plt.xlabel('시간')\n",
        "plt.ylabel('값')\n",
        "plt.grid(True, alpha=0.3)\n",
        "plt.show()\n",
        "\n",
        "print(f\"데이터 크기: {len(data)}\")\n",
        "print(f\"데이터 범위: {np.min(data):.3f} ~ {np.max(data):.3f}\")\n"
      ]
    }
  ],
  "metadata": {
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}
