---
# System prepended metadata

title: Nonparametric model
tags: [朱威達]

---

Nonparametric model
==
###### tags: `朱威達`

parametric model:據參數性的模型，也就是用training data來預測有限的w(係數)的集合，訓練完成後我們就可以用這一組w去描述這個模型。

nonparametric model:假設我們不能用一組有限的w集合去描述此分佈，我們用目前training data來預測接下來進來的data
 
所以需要保留多少訓練資料？不知道，要用多少參數描述model？不知道
這稱為instance based learning, memory based learning

# 查表
最簡單的方式是查表，將所有的樣本放進table中，我們要求h(x)時我們再去table中看x對應的y。
這方法很不一般化，若是x不在table之中就不知道答案

# Nearst neighbor model

給一組資料$x$，在他周圍找最近的k個樣本，稱為k-nearst neighbors，我們用$NN(k, x)$來到表這些鄰居

classification問題：看看$NN(k,x)$這些鄰居是哪個類別多(因為要投票，所以一般會選擇基數個鄰居)

regression問題：我們取$NN(k,x)$對應的output的平均，或是中位數作為output

這邊舉個例子：
![](https://i.imgur.com/FXZbO9k.png)
(a)只考慮一個鄰居，會容易overfitting像是紅色圈圈那邊
(b)考慮5個鄰居，解決overfitting的問題(有一點點underfitting)

Nearst neighbor model依舊還是會有overfitting, underfitting的問題

要幾個鄰居**沒有一個標準答案**，可以做cross-validation試試看最適合的鄰居k

## 定義最近鄰居
不同計算距離的方式會得出不一樣的鄰居

### Minkowski distance
![](https://i.imgur.com/xFMcfAD.png)
p是一個參數，p=1時，是Manhattan Distance。p=2時，是Euclidean Distance。

Manhattan Distance：
為水平距離加垂直距離。
$d(x,y)=|x_1-x_2|+|y_1-y_2|$

Euclidean Distance：
![](https://i.imgur.com/9GJxSHc.png)

### Hamming distance
對boolean的attributes
兩個長度相等的字串，將其中一個變換成另外一個字串所需要替換的字元個數。
例如字串"1111"與"1000"之間的Hamming Distance為3

## 正規化(Normalization)
橘子蘋果不能加在一起。
有好幾種loss func 不能隨便加再一起，要注意數量(單位)。若loss1(0~1000), loss2(0~1)現在兩個相加，loss2就沒用了。（可以乘上weight解決）

所以**正規化**很重要

有很多種不一樣的正規化方法。
最普通是是$\frac{x-平均}{標準差}$

## curse of dimentionality
(這邊老師寫板書忘了補...)
在低維度之下，nearest neighbor他運作的不錯，但是高維度就不太行。

令$l$為鄰居邊長的平均，所以包含k個鄰居的體積會是$l^n$然後整樣本的總體積是$1$，得到$l^n=k/n$，化簡得$l=(k/n)^{1/n}$

隨著輸入的維度上升，input space的大小也隨之指數成長，那麼我們的訓練資料集佔整個數據空間的比例就會變得很小
**維度很高，越不可信**
所以
1. 降低維度很重要
2. 用locality降低為度

## k-d tree
今天若是採用今天進入幾個點，全部scan過一遍再找最近的鄰居，會爆。
所以會用k-d tree，用tree來代表資料的親疏遠近。

用來找最近k個鄰居
適用在很多examples時
是一個balanced tree，來建構樣本的遠近

1. 一開始所有樣本都在root
2. 挑一個數i(所有dim的中位數)
3. 若dim<=i，去左子樹，若dim>i去右子樹
4. 一直建下去

這樣就可以很簡單的找到k個鄰居

適用於樣本數>dim數
令維度為n，最好是$2^n個example$
所以若維度=10，則最好有1024個以上examples

若是資料不夠多，成本太高還不如用linear scan暴力scan過

## Locality-sensitive hashing
用hash table可以更快的找到鄰居。
目標不是放在100%正確的鄰居，而是專注在速度（近似解）

![](https://i.imgur.com/RJJWNCL.png)
- 所以透過projection，有很大的機率相近的example會落到相同的bin，但是這不是絕對的，小機率下很遠的example也會到同一個bin
所以有一hash function g(x)給任何$x_j, x_j'$如過他們距離超過cr，他們在同一個bin的機率會很小。如果距離小於r，他們在同一個機率很高。c,r要自己調。


- LSH 會創多個random projection，再合併他們。
我們選$l$個random projection再創$l$個hash table

有有這些random projection, $x_q$進來，分別丟給這$l$個function，得到$l$個結果。
$x_q丟進g_1(x)，取g_1(x)的鄰居$
$x_q丟進g_2(x)，取g_2(x)的鄰居$
$x_q丟進g_3(x)，取g_3(x)的鄰居$
...
對這些些所有的鄰居取$\cup$（所有可能是x鄰居的人），存在$C$之中



再來再從$C$之中取最近的k個鄰居，有很高機率可以全找到
證明略...

**速度提升很多！速度提升很多！速度提升很多！速度提升很多！速度提升很多！**


## Nonparametric Regression

![](https://i.imgur.com/q2jJaQv.png)

### （a）連連看
是最簡單的Nonparametric Regression
當雜訊小時，效果還不錯
當雜訊大的時候，很容易爆掉

### （b）k-nearest-neighbors regression

sliding window 的感覺，這邊取k個鄰居，然後取他的平均值就是他hypothesis的預測
(這邊圖上用3)

### （c）k-nearest-neighbors linear regression

這邊取k個鄰居，每次找一條最好的線通過他，不斷重複，這個結果依然不是連續的，如圖上所示
(這邊取三個)

### （d）Locally weighted regression

用sliding window的想法
希望要**有continuous**
所以取一點$x_q$，很近的neighbor weight比較重，比較遠的neighbor weight 較輕(或是趨近於零)

他概念像是這樣：
![](https://i.imgur.com/2NHTlri.png)
取10個鄰居，他的weight就用$k(d)$那個function來算出來

**他就會取10個鄰居，取中間的點帶quadratic kernel可以得到權重後的結果，每次sliding window看一格，然後預測出很多條線，最後在取這些線的平均。**

![](https://i.imgur.com/NRrtjZm.png)
用gradient descent更新w，然後完成這個regression



# Support Vector Machine(SVM)

2000-2010很強的時光

不需要很多先備知識就可以直接尻svm，效果都還不錯

![](https://i.imgur.com/KNBaCDw.png)
現在要區分黑白兩色的線有無限多條，哪一個是最好的呢？

對svm來說最好的線是margin area的平均（margin area是虛線，由support vectors 決定）

supprot vector -> 就是boundary的衛兵

有些example的重要性比較大(像是Locally weighted regression)，很遠的樣本沒什麼影響力。

SVM 目標不是為了降低empirical loss，而是generalization loss
要怎麼達到？**用maximum margin seperator（margin area 越大越好）**

要怎麼找到seperator(w,b)呢？
省略數學的部分....

**seperator定義為${w\cdot x +b=0}$**
所以概念上我們可以用gradient descent來求得w,b，此w,b會使他的margin是最大的。
但是我們可以改寫為另外一個問題(dual problem)，可以順便解出w,b
$x_j, x_k$為訓練資料
![](https://i.imgur.com/k7y7Jzd.png)
這邊也沒有要推＠＠
![](https://i.imgur.com/wctVWh1.png)
![](https://i.imgur.com/1X0CNs0.png)

我們要先找到$\alpha$就可以推出w，$w = \sum\alpha_jx_j$

他有三個重要性質：
1. 他是convex$\equiv$他可以找到global最佳解
2. input的點運算只需要跟少量support vector內積、加法、乘法，就可以判斷是哪類，大於0還是小於0呢？
3. 只有**support vectors**的$\alpha_j\neq0$其他點的$\alpha=0$(support vector看很重，其他都不看的意思)

![](https://i.imgur.com/SvieGaR.png)

可以用$h(x)=sign(\sum\alpha_jy_j(x\cdot x_j)-b)$判斷是黑是白，因為不是support vector的樣本之$\alpha=0$所以很快就可以判別。

SVM是非參數模型，但是有support vector，可以之參考幾個參考他們幾個，便偷偷取得參數模型的優點。

**可以被線性區分 -> linearly seperatable -> SVM**

## 用多維SVM

常常資料不是容易線性區分的
![](https://i.imgur.com/Z1p7S7m.png)
如果像是上面左圖，不能用linear 區分，可以把他圖map到高維度的空間，這樣就可以用線性分類(上右圖)

因為老是好像寫黑板，所以我的理解是

$F(\begin{bmatrix} x_1 \\ x_2 \end{bmatrix})=\begin{bmatrix}f_1 \\ f_2 \\ f_3\end{bmatrix}=\begin{bmatrix} x_1^2 \\ x_2^2 \\ \sqrt{2}x_1x_2 \end{bmatrix}$

理論上是一定可以被線性區分的，可以**一直往更高維度mapping**一直試。

所以理論上我們要計算mapping到高維度的$x_j\cdot x_k$就可以用$F(x_j)\cdot F(x_k)$
之後再可以得到，$F(x_j)\cdot F(x_k)=(x_j\cdot x_k)^2$

**Kernel trick**
大概的總結是：要計算高緯度的內積，並不需要把它轉換成高緯度再計算，可以在低維度直接求出來高維度的內積結果 -> 運算有效率

## kernel function

要計算高緯度的內積，並不需要把它轉換成高緯度再計算，可以在低維度直接求出來高維度的內積結果 -> 運算有效率

kernel function = $(x_j\cdot x_k)^2$

有很**多種不同**的設計

1. 讓你不真的mapping到高維度，但是可以得到高維度function內積的結果。
2. 因為這低緯度function更高維度的操作，使svm 不會限制在線性的分類，使他超強。

## Soft margin classifier

在實際狀況也沒有一定要堅持100%分類（還可能overfitting），所以可能分辨到
一定程度錯了也沒有關係。
寧可有一些是錯的，這樣他的一般化會比較好


# Ensemble Learning

選定一集合、一堆hypothesis，然後結合他們的預測
生成多個決策樹，然後最後在投票看看哪一個是最好的

三個臭皮匠，勝過諸葛亮的概念，一個樹爛掉的機率，一定比三棵樹爛掉的機率高
![](https://i.imgur.com/Mc9gug2.png)
另一個裡解是，看一下這個圖，如果是單一條分類的話+,- 分為兩邊會有很多錯誤，但若是三條邊一起結合起來，就可以很清楚圍出一個boundary出來。

## Bagging

有一大資料庫，隨機取一些出來當training set ，重複做k次，可以得到k個個training set，就可以做出k個不同的hypothesis。

最後平均他們的output（看分類哪個比較多）:$h(x)=\frac{1}{K}\sum h_i(x)$

classification, regression都是可以用的

可以壓低他的variance，減緩某些(over/underfitting)，在**訓練資料很少的時候**很有用。

在實際的作法上很強

## Random forest

一堆k個決策樹，然後做bagging
重要的是要**隨機選attribute**，而不是像以前只選擇Gain()最強的attribute。
也就是隨機選一個attribute然後再找他資訊量高低作為split point（多了隨機性）

再來推廣，原本用的資訊量高低分，現在用隨機的split point來分左右子樹
稱為extremely randomized tree(Extratree)

用cross-validation可以找出：
1. K個樹
2. 每個數N個example
3. split point的attribute數
4. 用random split的數目

Random forest 比較不會overfitting

隨著數越多，他會越收斂

## Stacking

同樣training set 用3種model, SVM, logistic regression, decision tree.

![](https://i.imgur.com/PCDsGxf.png)
![](https://i.imgur.com/vCOlZeN.png)
input(10維)，output(13維)
可以看到他在最後會append粗體字分別是，SVM, logistic regression, decision tree的預測。像是結合不同model的意見。
圖上面結合yes, no, no 會output=no

![](https://i.imgur.com/LeYh4hC.png)
也可以設定每一個model 的權重

項是在基礎模型之上再搭一個模型的感覺

stacking比單一模型降低bias，效能也比單一模型好

## Boosting

最常見的一種
最重要的想法是weighted training set，某樣本的weight越大，他對hypothesis的重要性也越大。

最一開始大家的$w_j$都=1，生成第一個hypothesis $h_1$（這$h_1$有對有錯），希望可以**針對分類錯誤地改進**，分類錯的loss比較高，所以就是提高分類錯誤的weight，降低分類正確的weight。
我們會不斷更新$h_n$，做個k次，集合他們的結果。

![](https://i.imgur.com/Pmv6npb.png)
 方塊的大小代表在權重，所以錯誤的權重一直增加，正確的權重減少。
然後最後再總和大家的答案(根據圖，按照大家的決策數大小，越大權重越高)

### adaboost

ada=動態
動態調整boosting

意思是，集結很多L - weak learning algo（就是比亂猜好一點點），只要集結夠多L就可以得到正確率高的hypothesis

回到boosting
![](https://i.imgur.com/eDDQHpU.png)
可以看圖說，boosting的效能真的提升
根據圖也可以看出他的K數量數量選擇上有上限，因為選一定的K時，他的error就變得很低很低，就沒有再增加K的意義了。

## Online learninig

目前為止我們都**假設**資料是i.i.d(independent and identically distributed)，因為數學比較好推導，但是過去對未來的資料說independent，我們怎麼預測未來？又怎麼說我們為來對過去independent？狀態隨時在改變

所以不是i.i.d怎麼辦？我們會考慮online learninig
```clike=
onlinelearninig(){
    if(新的資料模型判斷錯){
        修正舊的模型
    }
}
```

### Randomized weighted majority algo

就是來聽聽大家(punkits)的判斷，他對多相信一點，他錯少相信一點。
![](https://i.imgur.com/zu5xnFQ.png)
長久下去，說得很準的punkits權重越來越高（越相信他）
![](https://i.imgur.com/n7Ee3au.png)
M的數學也沒有推導...

如果$\beta$接近1 -> 降低weight的速度慢
要容忍錯誤很久
如果$\beta$接近0 -> 降低weight的速度快
錯誤容忍率低
各有好壞

一般的model目標降低loss，這裡目標降低regret

**資料隨時間變動**，或是**不斷要考慮新資料**的會需要online learning
ex:google search關鍵字


# Summary
![](https://i.imgur.com/psTohwZ.png)
需要定義一個loss function，針對你想要的預測

當你幫問題拆成很多小條件，有些物件可以直接拆成許多小物件，不一定每一個都需要機器學習

要開發時要知道自己的目標、資料來說要用監督式、非監督是、還是強化學習。

![](https://i.imgur.com/XBRXxHn.png)
有沒有資料？
資料哪來？正確性？

![](https://i.imgur.com/QdTV8E7.png)
1. preprocess
2. normalization(單位)

![](https://i.imgur.com/4CxZKx3.png)
沒有說哪個模型是最好的，只有比較適合的場合
Randomforest -> 很多種feature，但是有許多不相關
Nonparameteric -> 有很多資料且你沒有先備知識
Logistic regression -> 適合線性分類
SVM -> 適合資料不多的時候
deep neural network -> a data analysis method that uses machine learning algorithms to automatically recognize patterns and regularities in data

經驗～～

![](https://i.imgur.com/1KQjB0d.png)
- 不要全然相信你的model
- Interpretability:你可以知道為什麼他會吐出這個output（近年的不知道為什麼）
- Explainability:知道他怎麼吐出這個output


