---
# System prepended metadata

title: 2.6 Regression
tags: [ML]

---

# 2.6 Regression

在做 classification 時，給定一個 input，我們得到的 output 是 boolean 的，也就是一個 yes / no 的答案；但如果我們的 output 是一個++數值++，那我們想 learn 的就不是像 boolean 一樣是一個 $C(x)\in \{0,1\}$ 的 class，而是一個 ++numeric function++。
> 意思就是我們想找一個 function，使得你給它 input，它不會只是告訴你 yes／no（$0/1$），而是 output 一個實數給你。
> 
> 舉例來說：
> $f(x) = 2x + 3$，給 input $x=1$ 會 output $f(1) = 5 \in \mathbb{R}$。  

在 ML 裡面，我們不知道這個 function 到底是什麼，但是我們有 training set：

\begin{equation}
X=\{x^t,r^t\}_{t=1}^N
\end{equation}

其中每個 label $r^t\in R$，可以讓我們去估計我們想要的這個 function。
> Recall：我們的 notation 是 $t$ 為 index，所以 $X$ 代表的是我們有一個 data set，裡面有 $N$ 個點，每個點的 feature 用 $x^t$ 表示，對於 $x^t$ 這個 input，我們觀察到的 output 為 $r^t$。

看一個圖比較清楚：

![image](https://hackmd.io/_uploads/SJSSxq7dR.png)
> 在 regression 裡，我們就是要去找出這條線（但也不一定是一條直線，也有可能是二次曲線、三次曲線⋯⋯）到底是什麼樣子。

如果沒有 noise，我們的目標就是去做 <font color = "snake">interpolation</font>。
> 沒有 noise 的意思是我們找的到一個 function，可以完美符合我們的 training set 的 data points。

我們想要找到一個穿過這些點的 function $f(x)$，使得 $r^t=f(x^t)$
> 也就是某個 index $t$ 的 example $x^t$ 會被 $f(x)$ 這個 function map 到它正確的 label。

在 <font color = "snake">polynomial interpolation</font> 中，給定 $N$ 個點，我們想要找到一個 degree 是 $N-1$ 的多項式，讓我們可以藉由它去預測任何 $x$ 的 output；如果在做這件事的時候，我們的 $x$ 超出 training set 裡 $x^t$ 的範圍，那我們就稱為 <font color = "snake">extrapolation</font>。

舉例來說，在 time series prediction 中，我們有過去到現在的 data，然後我們想要預測未來的 value，這就是 extrapolation。
> time series prediction 就是透過過去的 data 來預測未來的 value。

在 <font color = "snake">regression</font> 中，noise 會被加到這個未知 function 的 output，得到以下的式子：

![2.11](https://hackmd.io/_uploads/H1sxI1plA.png)
> 其中 $f(x)\in R$ 是未知的 function，$\epsilon$ 是 random noise
>> - 為什麼會有 noise 其實就是像前面提到過的，是因為有額外的隱藏變數我們沒觀察到。

![2.12](https://hackmd.io/_uploads/r1j3L1ax0.png)
> 其中 $z^t$ 代表的是隱藏的變數，我們希望透過我們的 model 去接近這個 output。

在 training set $X$ 上，我們也可以去計算 emperical error：
![2.13](https://hackmd.io/_uploads/HJ0XvJ6lA.png)

因為 $r$ 和 $g(x)$ 都是某個數值（舉例來說，它們都屬於實數），所以在他們之上存在 ordering，於是我們可以對他們的值之間的差距去定義 distance，像是：

1. 兩者差的平方
> 是一種 error(loss) function
2. 兩者的差取絕對值

$\rightarrow$ 比起只是看是否相等，去定義距離提供了我們更多的資訊。

在 $2.13$ 的式子裡，我們就是用第一種方式來定義 distance，透過這個 $\sum$ 從 $t=1$ loop 到 $t=N$，我們就能加總所有的 instance 如果被 label 錯，那錯的誤差有多大。而加總完再取平均，就是我們的 emperical error。

有了這些定義以後，我們的目標就變成：
:::warning
找到某個 $g(·)$ 使得 emperical error 最小。
:::
> 其實意思就只是去找一個 $g(·)$ 使得我們 input 丟進去，output 出來的預測值和實際的 data 間差距最小。

$\rightarrow$ 我們的方法和之前一樣，就是去假設一個 $g(·)$ 的 hypothesis class，其中 parameters 只有一個小小的 set。

如果我們假定 $g(·)$ 是 linear 的，我們可以令：

![2.14](https://hackmd.io/_uploads/ByVFhkTlA.png)

:::danger
此處有一 1.2.3 的例子的延續，我的課本缺頁就不續講。
:::
> 此例只是要說明如果我們有一個 linear model：
> ![2.15](https://hackmd.io/_uploads/r11dak6lA.png)
> 那麼這裡的 $w_1$ 和 $w_0$ 就是我們要從 data 去 learn 的 parameters，而這兩個 parameters 的 value 應該要使 emperical error 最小。
> 
> $\rightarrow$ 如何做到這件事即對這兩個變數偏微。

總之，結論就是：

如果 linear model 太簡單，那它就會很受限制，也容易造成很大的 approximation error；但如果我們增加 polynomial 的 order，雖然在 training data 上 error 減少了，但是 high-order 的 polynomial 會太過於遵照單一的 examples，而沒有去抓住 general 的趨勢。

例子如下圖：

![fig 2.10](https://hackmd.io/_uploads/BkRtyx6eA.png)
> 在這張圖裡面，我們用三個 polynomials 試圖去 fit 打叉的那些點，紅色的六次多項式每個點都有經過，是個 perfect fit，但是因為我們只有數量這麼少的 data，所以實際上的曲線很有可能不是長這樣。
> 
> 相對之下，綠色的 linear polynomial 又太簡單，二次曲線看起來又比它看起來好一點。