{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {
"id": "8GTL9Gqaxlg4"
},
"source": [
"# The Basics\n",
"\n",
"\n",
"\n",
"[Slides: The Basics 1](https://github.com/ichatnun/brainCodeCamp2023_lectures/blob/main/DimensionalityReduction/dim_reduction_part1a_basics1.pdf)\n",
"\n",
"
"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {
"id": "A2t1e5bEBgsy"
},
"source": [
"Dimensionality reduction คือ การลดจำนวนมิติของข้อมูล\n",
"\n",
"หากใช้ภาษาทางเทคนิค เราจะเรียกว่าเป็นการแปลงข้อมูลจากข้อมูลใน space ที่มีจำนวนมิติมาก (high-dimensional space) มาสู่ space ที่มีจำนวนมิติน้อย (low-dimensional space) ซึ่งเรามักจะออกแบบการลดจำนวนมิติลง โดยที่สูญเสียข้อมูลน้อยที่สุดเท่าที่ทำได้\n",
"\n",
"ตัวอย่างของข้อมูลที่มีจำนวนมิติมาก\n",
"\n",
"\n",
"* ข้อมูลรูปภาพ gray scale โดยที่แต่ละภาพมีจำนวน pixel เท่ากับ 1,024 x 1,024 = 1,048,576 pixels และเราใช้แต่ละ pixel เป็น feature แปลว่าในกรณีนี้ภาพ 1 ภาพ จะเป็นข้อมูล 1 จุดใน feature space ที่มี 1,048,576 มิติ (1,048,576-dimensional space)\n",
"\n",
"* ข้อมูล vdo ที่มีสี (แดง เขียว น้ำเงิน หรือ RGB) โดยเราสามารถมอง vdo เป็นรูปภาพจำนวนมากที่มาเรียงต่อกันได้ ถ้าหากแต่ละภาพใน vdo มี 1,024 x 1,024 pixels และเป็น vdo ความยาว 5 นาที ที่มี frame rate เท่ากับ 24 frame ต่อวินาที ข้อมูลของเราจะเป็นจุดใน space ที่มีทั้งหมด 1,024 x 1,024 x 3 x 24 x 5 x 60 มิติ หรือประมาณ 22 หมื่นล้านมิติ\n",
"\n",
"* ข้อมูลสัญญาณสมองที่เก็บมาจากเทคนิค electroencephalogram (EEG) ซึ่งมักจะมี sensor เก็บข้อมูลประมาณ 64 ตัว แต่ละตัวจะเก็บข้อมูลที่ประมาณ 1,000 จุดต่อวินาที ถ้าหากเราเก็บข้อมูลทั้งหมดเป็นเวลา 5 วินาที จะส่งผลให้ข้อมูลของเราอยู่ใน space ที่มีทั้งหมด 64 x 1,000 x 5 = 320,000 มิติ\n",
"\n",
"\n",
"ถ้าหากเราสามารถลดจำนวนมิติลงได้ จะส่งผลดีอยู่หลายประการ เช่น\n",
"\n",
"1. เราจะใช้ทรัพยากรการคำนวณน้อยลง เช่น ถ้าหากเราสามารถ represent ภาพ 1 ภาพ ด้วยตัวเลขแค่ 64 ตัว (แทนที่จะ represent ด้วยตัวเลข 1,048,576 ตัว) เราก็จะสามารถนำเอาโมเดลปัญญาประดิษฐ์ที่เรารู้จักมาประมวลผลได้อย่างรวดเร็วและใช้ทรัพยากรการคำนวณน้อย\n",
"\n",
"2. นอกจากนี้ หากเราลดจำนวนมิติของข้อมูลลงจนเหลือไม่เกิน 3 มิติ ก็จะช่วยให้เราสามารถนำเอาข้อมูลมา plot และดูได้ด้วยตาเปล่า\n",
"\n",
"ในการลดจำนวนมิติของข้อมูล เราสามารถใช้ทั้งเทคนิคที่เป็นแบบ linear หรือ แบบ non-linear ก็ได้ โดยที่แต่ละเทคนิคก็จะมีข้อดีและข้อเสีย และมีสมมติฐานในการใช้งานที่แตกต่างกัน\n",
"\n",
"
\n",
"\n",
"---\n",
"\n",
"\n",
"\n",
"[Slides: The Basics 2](https://github.com/ichatnun/brainCodeCamp2023_lectures/blob/main/DimensionalityReduction/dim_reduction_part1b_basics2.pdf)\n",
"\n",
"
\n",
"\n",
"สมมติว่าเรามีชุดข้อมูลชุดหนึ่ง ที่มีจุดข้อมูลอยู่ทั้งหมด 100 จุด แต่ละจุดข้อมูล $(x,y)$ เป็นข้อมูลใน space ที่มี 2 มิติ (ค่า $x$ เป็นมิติแรก และค่า $y$ เป็นมิติที่สอง) และในชุดข้อมูลนี้มีจุดอยู่ 2 ประเภท (2 classes)\n",
"\n",
"\n",
"* class 1: $y = 1$ โดยที่ $ -4 ≤ x < 0 $\n",
"* class 2: $y = 1$ โดยที่ $ 0 < x ≤ 4 $\n",
"\n",
"ดังแสดงด้านล่าง"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "GQZLjejKQvxQ"
},
"outputs": [],
"source": [
"import numpy as np\n",
"from sklearn.decomposition import PCA\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import colors\n",
"\n",
"import ipywidgets as widgets # ใช้สำหรับการทำ interactive display"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 564
},
"id": "qUyqFRnnA9s8",
"outputId": "cc3355ae-fdf0-48c6-89e1-79f57001282f"
},
"outputs": [
{
"data": {
"image/png": "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6fxTK4WFhcXus2TJEjVv3lzNmjXTyZMnPZfu3btLktavX1/mtYDyQFgABv3www8KCgryXP/uu+80evRo1a9fX4GBgQoLC1NMTIwkXTEKLti0aZN69uypGjVqqFatWgoLC/M8T16WsDhy5Iiys7O1efNmORwO/dd//VeRB+2NGzcqMTFRPj7X/uPg0gdiSQoNDdX3339/zWtey+xff/21fHx8dNNNNxVZKzw8XLVq1dLXX39d4ue7EEHXElh79uzRPffco5CQEAUHByssLEwPPvigpF++RzExMUpNTdXf/vY31a1bV7169dLLL79c5Ht4//33KzExUQ8//LDq16+vBx54QG+99VaRMDhw4ID27NmjsLCwIpdbbrlFknT8+PEyrwWUB86xAAz59ttv5XK5ijyo9e/fX5s3b9bjjz+uuLg41axZU4WFherdu3eZfsB/+eWX6tGjh5o1a6YZM2YoKipK/v7+eu+99zRz5swrrtGxY0dJUlZWlg4ePKi2bduqRo0a6tSpk2bPnq0ffvhBn376aannD5SFr69vsdsty7rmNa9n9isdYTDp1KlT6tKli4KDg/Xss8+qSZMmCggI0I4dO/Tkk08W+R69+OKLSk5O1vLly7VmzRqNGjVK6enp2rJliyIjIxUYGKisrCytX79eq1at0gcffKDFixere/fuWrNmjXx9fVVYWKhWrVppxowZxc4TFRUlSWVaCygPhAVgyKJFiyRJvXr1kiR9//33WrdunSZNmqRnnnnGs9+BAwcuu21JD4Tvvvuu3G63VqxYUeSowIXD3VfSqFEjNWrUSBs3btTBgwc9T1d07txZqampWrJkic6dO6fOnTuXuk55PVCXtu61zB4dHa3CwkIdOHCgyMmlx44d06lTpxQdHV3i54uNjZUk7d69+6q+hg0bNujf//633nnnnSKzfPXVV8Xu36pVK7Vq1UpPP/20Nm/erMTERM2ZM0dTpkyRJPn4+KhHjx7q0aOHZsyYoalTp+qpp57S+vXr1bNnTzVp0kQ7d+5Ujx49rvh9udJaQHngqRDAgMzMTE2ePFkxMTEaMGCApF/+FX/pv9pnzZp12e1r1KghSZe9QVZxa7hcLi1YsKDMs3Xq1EmZmZnaunWr58E5Li5OQUFBeu655xQYGKj4+PhS1yhpvutVvXr1Ute92tl/85vfSLr8Pr7wr/s+ffqU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",
"text/plain": [
"