# 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 又太簡單,二次曲線看起來又比它看起來好一點。