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