順便打個廣告 TW useR Group

台灣的 R 語言的使用者社群 TW useR Group

每周一會有 MLDM Monday 的聚會

** 社群的 Youtube 頻道
https://www.youtube.com/user/TWuseRGroup

** 社群的 Meetup
http://www.meetup.com/Taiwan-useR-Group/

** 社群的 Facebook
http://www.facebook.com/TaiwanUseRGroup

Posted in R Programming | Leave a comment

New 演衡學習筆記

演衡學習筆記新站位置

http://learning.c3h3.org/

Posted in Uncategorized | Leave a comment

Unsupervised Learning — Clustering Analysis

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

請問一下各位讀者,如果要將下圖的Data分群的話,你會把它分成幾群 (Cluster) 呢?? 怎麼分??

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Clustering Analysis的問題,顧名思義就是要在Data之中進行分群的動作。典型的問題大致如上圖,圖中有 “兩群” Data,而我們需要找個辦法把這兩群Data分開,方法有非常非常多種,下面將會慢慢的介紹。

除了分開的方法外,Clustering Analysis中還有另一個極困難的問題,就是在Data中一共應該分成幾群?比方說上面的圖中就應該是有 “兩群” ,而在下面的數字中,就應該分成 “四群”,一個數字成一個cluster才對。

除了群數不同以外,顯然我們很直覺得可以感受到,用來分數字的方法也絕對和用來分第一個圖的方法會非常非常的不一樣。第一個圖的兩個 群(Cluster) 都具有圓對稱的特性,而第二個卻是彎來彎去的形狀。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

簡單的整理一下,Clustering Analysis的問題中須要考慮的重要問題有兩個:

  • 一共有幾群 Clusters 在Data中?
  • 要如何分開?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

「一共有幾群?」是model selection的問題,等之後寫道model selection部分的學習筆記的時候,會再詳細討論。在這裡,我們先討論如何把不同的群分開的方法。

方法有很多種,依照是否有機率模型在背後,可分為 model-based 或 algorithm-based;另外,也可以按照 linear 或 non-liner 來分類。

Algorithm Based Methods:

  • 此類的方法,主要就是有一個演算法,一個跟機率模型看似不太相關的演算法,只須要照著演算法操作計算,就能得到答案了。如下:



    • K-mean Clustering
    • K-mean是Clustering Analysis中最常見也是最簡單、最powerful的演算法了。演算法分成兩部:(1)求離個群中心最近距離的點 (作分群的動作) (2) 把第1部分好的群求取重心作為新的群中心。 (如下方動畫)
    • 參考資料: Lecture Note (Andrew) / Wikipedia

    (此動畫為k-means演算法,分類2D上3個clusters的問題)

    Model Based Methods:

    • 此類方法多半有搭配機率模型在背後,而求解的時候,多半是用Maximal Likelihood Principle 求解機率最大的參數。常常會使用到EM Algorithm作為求解時的工具。
    • 此類方法也常常會把Unsupervised的問題看成Supervised的來求解。例如求解,第一張圖的那兩個clusters,我們就會把它看成有編號的clusters,然後在求解的過程中每個點上的編號會隨著,編號的機率分布的改變而改變。


    • Mixture Gaussian
    • 此方法和k-means基本上是對應的。不過這邊所使用的是EM Algorithm求解,但仔細深入去看Gaussian的 EM Algorithm,會發他實在非常的像k-means。
    • Mixture Gaussian的想法大致上如下圖,先在每個點上假想有一個”編號”的隨機變數,然後求解 max P(點的位置, 點的編號, 模型參數)。
    • 參考資料:Another Website / Lecture Note (Andrew)


    Non-Linear Methods:

    • 最後這類的方法,是真對cluster不呈現Gaussian之類的圓對稱的狀態時,所使用的方法。Kernel Trick 一直是我們在這方面的問題上,第一個直接想到並使用的技巧。只要把原本Linear的方法做Kernelize往往就可以得到Non-Linear的效果。



    To be continued

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    相關文章:

    • K-means Clustering
    • 使用R作K-means Clustering

    To be continued

    Posted in Clustering Methods, Data Mining / Machine Learning | Leave a comment

    Introduction to Dimension Reduction

    Dimension Reduction,顧名思義,就是原本的Data寫在一個比較高的維度作標上,我們希望找到一個低維度的作標來描述它,但又不能失去Data本身的特質。

    底下我們來看個例子,這是一條線上的一些點

    Data是寫在兩維的平面 \mathbb{R}^2 上,但其實用把它投影在紅色箭頭的方向上,一個個變數就可以完成的描述Data了。

    當然,我們真時遇到的Data可能不會像上面這麼完美。我們稍微對上面的Data稍微加一點noise,如下:

    仔細觀察一下這兩個方向:

    • 在紅色的方向上,Data散的很開,幾乎不同的Data會取到不同的投影座標。
    • 在綠色的方向上,Data靠的很近,很容易出現不同的Data取同一個投影座標。

    因此,我們大概可以歸納出

    “尋找讓Data投影上去,散最開的方向!”

    這樣的結論。它是PCA的其中一種Approach的方向,另一種Approach的方式是用Least Square也可以導出同樣的效果。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    在看完簡單的例子後,我們來看一下,在Dimension Reduction的發展過程中,大概有幾個主要的方展方像呢?

    大致上筆者是分成三大類:

    Unsupervised Dimension Reduction:

    • 這類的問題通常都在各領域發展的比較前期會遇到的。
    • 通常我們只有用一堆描述Data用的座標,而我們需要作的,就是設法去尋找主要的成份? 或是主要的結構?
    • 比方說,”人臉”的主要成分(結構)可能是”有鼻子”、”有嘴巴”、”有眼睛”……之類的
    • 順帶一提,在人臉辨識上很常用的Eigenface,就是基於這樣的原理發展出來的。
    • 例如,最上面那個圖,如果data完全躺在一條線上,那他的主成分就是那個方向。

    Supervised Dimension Reduction:

    • 跟上面的問題不同的部分是,在這個framework中,我們除了有描述data的座標外,我們還有data的類別的資料。
    • 所以,這時候我們希望作的,通常是找到一組座標,使得不同的類別之間的鑑別度達到最大。

    Geometric (Manifold) Learning:

    • 這類型的方法,通常是希望研究Data在高維度中的低維度幾何結構。比方說,如果有一組data都躺在平面上的某個圓上,就維度而言,圓是一維的。但我們如何能只用一個座標寫出data呢?
    • 在這裡我們借用幾何的local chart的概念,使用local coordinate 來寫data,就可以解決這類型的問題了。
    • 它和Unsupervised Dimension Reduction 想做的事情是一樣的,只是一個使用global coordinate,另一個使用local coordinate。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    而三個大方向,各自又有哪些常用的方法呢?

    Unsupervised Dimension Reduction:



    Supervised Dimension Reduction:



    Geometric (Manifold) Learning:

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    相關文章:

    • PCA
    • Dimension Reduction — L2-norm PCA
    • R的內建PCA指令 — princomp / prcomp
    • R的內建PCA指令 — princomp / prcomp [定義篇]
    • R的內建PCA指令 — princomp / prcomp [簡單的例子]
    • R的內建PCA指令 — princomp / prcomp [一眼看出PCA的例子]
    • R的內建PCA指令 — princomp / prcomp [簡單的圖片的例子]


    • KPCA
    • R的KPCA Package — kernlab


    • PLS
    • R的PLS Package — pls


    • SIR
    • R的SIR Package — dr


    • LLE
    • R的LLE Code
    • R的Diffusion Map Code

    To be continued.

    Posted in Data Mining / Machine Learning, Dimension Reduction | Leave a comment

    Supervised Learning — Classification and Regression

    「要如何知道明天溫度大概幾度呢?」、「要如何分辨橘子和蘋果呢?」、「明天股市會漲還是會跌呢?」、……等等。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    舉凡這類型的問題,大概都可以算是Supervised Learning的範疇。大概就是有一個我們想知道的結果 — Output/Label (例子中的溫度,蘋果或橘子,漲或跌,……);然後我們必須拿一些東西 (Input/Feature) 想辦法去猜出這些我們想知道的東西,比方說我們可能會想拿歷史溫度、溼度、風速、…等等去猜明天的溫度,拿顏色和形狀去猜水果,拿歷史股價去猜股市。

    值得一提的是,在真實的問題中,要如何選到好的Input也是一門很大學問 (Feature Selection)。一般而言都和實作經驗有很大的關係,有越多的Domain Knowledge會作的越好。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Supervised Learning的工作是在當我們選好了Input和Output後,有系統的建後出一個Predictor (Classifier) 以便之後進行預測的工作。

    換成比教數學的語言說,就是當我們選好Input,Output: \{(x_j,y_j)\}_{j=1}^N 之後,我們會希望找到一個函數 f,使得

    f(x) \sim y

    依照 y 的性質的不同,又可以將問題分成:Regression (y \in \mathbb{R}) 和 Classfication (y \in \{+1,-1\})。

    比方說溫度的問題就是Regression的問題,而後面兩的問題就是Classification的問題。不過, 這個分類並沒有那麼硬性,而且許多方法是可以在兩邊同時使用的;比方說第三個問題好了,如果你想知道「明天會漲跌幾點?」那又會變成Regression的問題。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    常見的Classification Methods:

    常見的Regression Methods:

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    相關文章:



    Posted in Classification and Regression, Data Mining / Machine Learning | Leave a comment

    2012 in review

    The WordPress.com stats helper monkeys prepared a 2012 annual report for this blog.

    Here’s an excerpt:

    600 people reached the top of Mt. Everest in 2012. This blog got about 4,100 views in 2012. If every person who reached the top of Mt. Everest viewed this blog, it would have taken 7 years to get that many views.

    Click here to see the complete report.

    Posted in Uncategorized | Leave a comment

    20110308 心得 —— 不要浪費自己之前所造的業

    我們現在會遇到「別人來指出我們的過失」,是不是也是在我們之前的時候,曾經造下「幫助別人認識他們的過失」的業,所感得的果報呢? 

    如果,我們曾經很發心的想要幫助別人改正他們的問題,雖然加行不夠善巧,導致對方稍起煩惱,但利他的心,的的確確可能讓這份善業的果報回到我們身上。

    不過,常常卻由於自己的無明或執著,在果位上沒看到別人糾正我們,那份想幫助我們的發心,也沒看到這可能是自己之前所造的善業所感的善果。

    一念的執著,卻浪費了別人的發心,也浪費了自己之前的善業。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    相關的偈頌:
    《入行論》云:「千劫所集施,供養善逝等,此一切善行,一恚能摧壞。」 (《廣論》P134)
    常師父於學佛次第:「一念瞋心起,百萬障門開。」
    (Ref:《華嚴經》普賢行品第三十六《八十華嚴》第四十九卷── 普賢行品)
    聖嚴法師:「任勞者必堪任怨,任事者必遭批評。怨言之下有慈忍,批評之中藏金玉。」
    聖嚴法師:「見有機緣宜把握,沒有機緣要營造,機緣未熟不強求。」
    聖嚴法師:「隨時隨地心存感激,以財力、體力、智慧、心力、來做一切的奉獻。」
    Posted in Uncategorized | Leave a comment

    一則探病的故事 2011 0315 0903

    有一個人生病了,病的很苦,住在醫院中,躺在病床上動彈不得。很多事情都不太能自己作,很多想做的事情都不能作。不能像之前一樣蹦蹦跳跳,不能去公園散步,不能去旅遊,不能陪家人聊天…等等。這病人有一個學佛的朋友,有一天這位朋友帶了一群友人去看這病人。

    到了醫院,這位學佛的有人,看到這病人的種種苦受。居然開始對他的朋友們宣說病苦…宣說三惡趣苦,就是像病苦一般的不自在,什麼都不能自主,自己想作什麼都不行作。並且宣說:只有三寶有救怙能力。

    最後,那群朋友,覺得自己又學到了新東西,很高興的離開了。或許,他們也很感謝那位病人所示現的病相,也很感謝那位學佛的朋友,所述說的道理。但是……

    各位…如果您是那位病人,你會很歡喜的感到:「真是太好了,原來我的病痛還可以讓這麼多人生起對三寶的信心,還可以讓這麼多人真實了解病苦。這病痛真是太值得了,可以讓我以往的惡業,變成善業,來幫助大家,真是太感謝那位學佛的朋友了!太感謝大家的精進學習了!」

    還是說,你心裡會想:「XXX…人家已經很痛苦了,你們是不會體諒一下喔!還在別人傷口上灑鹽…一直強調那些我想做但現在都無法作的事情。對啦!我就是之前造惡業,所以,才會現在生病在這裡。都已經這麼苦了!你們幹嘛還一直消費我???」

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    相關的公案和文句:
    (1) 《入菩薩行》的文句:
    (1.1)
    《入行》:「我應除他苦,他苦如自苦,我當利樂他,有情如吾身。」
    (1.2)
    《入行》:「我當離安樂,甘代他人苦;時觀念起處,細察己過失。」
    《入行》:「他雖犯大過,欣然吾頂替;自過縱微小,眾前誠懺悔。」
    (1.3)
    《入行》:「意汝定當知:吾已全屬他。除利有情想,切莫更思餘。」
    《入行》:「不應以他眼,成辦自利益。亦莫以眼等,邪惡待眾生。」
    (2) 導師世尊發菩提心的兩個公案:
    (2.1) [定培聽到的] 勇授大王,在地獄發菩提心。
    (2.2) [八戒聽到的] 孝子的故事,頭上帶火圈的刑具,願代下位受刑人受苦。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    當我們引用他人的苦受,述說佛法的時候。我們是否也曾經想過:

    • 我們是否願意,代替他人承受他人身上的苦受,而把自己的快樂交換給那個人呢?
    • 當我們身上有苦受時,我們是否也很樂意被別人當作案例呢?
    • 我們是否對於那些讓我們引用的案例,存有一份感激之心呢?
    • 我們是抱持著怎樣的心態,在引用這些案例呢?
    Posted in Uncategorized | Leave a comment

    R的內建PCA指令 — princomp / prcomp [定義篇]

    相信,看了這系列的文章後,讀者應該對Dimension Reduction和PCA都有些基本的認識了。接下來,讓我們進入實作的成面。

    下面,我們將介紹R的兩個內建計算PCA的指令 — princomp / prcomp

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    首先,我們先測試最簡單的直線的data。

    整個Data躺在 y=\frac{1}{2} x  這條直線上。其中x_i = i ; i = 1,2,\ldots,30

    如下方的code和圖:

    N_data <- 30
    test_data <- as.matrix(1:N_data)
    test_data <- cbind(test_data,0.5*test_data)
    

    接下來,我們分別用兩種指令,對test_data作PCA的分析:

    (1) 使用princomp:

    執行下方的code後

    test_data_PCA_princomp <-princomp(test_data)
    str(test_data_PCA_princomp)
    

    我們會在R console中看到:

    > test_data_PCA_princomp <- princomp(test_data)
    > str(test_data_PCA_princomp)
    List of 7
     $ sdev    : Named num [1:2] 9.68 0
      ..- attr(*, "names")= chr [1:2] "Comp.1" "Comp.2"
     $ loadings: loadings [1:2, 1:2] -0.894 -0.447 0.447 -0.894
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr [1:2] "Comp.1" "Comp.2"
     $ center  : num [1:2] 15.5 7.75
     $ scale   : num [1:2] 1 1
     $ n.obs   : int 30
     $ scores  : num [1:30, 1:2] 16.2 15.1 14 12.9 11.7 ...
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr [1:2] "Comp.1" "Comp.2"
     $ call    : language princomp(x = test_data)
     - attr(*, "class")= chr "princomp"
    

    也就是說,princomp這個指令所回傳的物件中,有7個attributes:sdev、loadings、center、scale、n.obs、scores、call

    其中,比較常使用的,如下:

    • sdev:為 Row data Matrix 的 Eigenvalues
    • loadings:為 Row data Matrix 的 Eigenvectors
    • center:為 Row data 的 Mean
    • scores:為 Row data Matrix 投影在 Eigenvectors 上面的坐標

    ~~~~~~~~~~~~~~~~~~~~~~

    (2) 使用prcomp:

    同樣的,執行下方的code後

    test_data_PCA_prcomp <- prcomp(test_data)
    str(test_data_PCA_prcomp)
    

    我們會在R console中看到:

    > test_data_PCA_prcomp <- prcomp(test_data)
    > str(test_data_PCA_prcomp)
    List of 5
     $ sdev    : num [1:2] 9.84 3.33e-16
     $ rotation: num [1:2, 1:2] 0.894 0.447 0.447 -0.894
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr [1:2] "PC1" "PC2"
     $ center  : num [1:2] 15.5 7.75
     $ scale   : logi FALSE
     $ x       : num [1:30, 1:2] -16.2 -15.1 -14 -12.9 -11.7 ...
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr [1:2] "PC1" "PC2"
     - attr(*, "class")= chr "prcomp"
    

    也就是說,prcomp這個指令所回傳的物件中,有5個attributes:sdev、rotation、center、scale、x

    其中,比較常用的attributes如下:

    • sdev:為 Row data Matrix 的 Eigenvalues
    • rotation:為 Row data Matrix 的 Eigenvectors
    • center:為 Row data 的 Mean
    • x:為 Row data Matrix 投影在 Eigenvectors 上面的坐標

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    回Topic: Introduction to Dimension Reduction

    上一篇:

    下一篇: R的內建PCA指令 — princomp / prcomp [簡單的例子]

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Posted in Data Mining / Machine Learning, Dimension Reduction | Leave a comment

    R上的CART Package — rpart [參數篇]

    在 rpart model 中大概有幾個比較重要的參數:

    • weights: 用來給與data的weight,如果想加重某些data的權重時可使用。 (例如:Adaboost.M1 的演算法)
    • method:分成 “anova”、”poisson”、”class”和”exp”。
    • parms:splitting function的參數,會根據上面不同的方法給不同的參數。(例如:”anova”方法是不需要參數的)
    • control: rpart.control object

    以上是rpart的參數部分,大部份都是集中在選擇model和data的權重上。一旦決定方法後,在model中的重要參數,大部分都是在control中用一個rpart.control的物件進行設定的。

    接下來我們來介紹 rpart.control中的幾個重要參數:

    • minsplit:每一個node最少要幾個data
    • minbucket:在末端的node上最少要幾個data
    • cp:complexity parameter. (決定精度的參數)
    • maxdepth:Tree的深度

    rpart.control中的參數很多,半筆者比較常用的大概是上面幾個。

    (附帶一提,rpart.control的參數,也可以直接掛在rpart的最後面”…”的地方。)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    接下來,我們將使用cats data調整不同的cp和minsplit:

    將前文中的這行

    cats_rpart_model <- rpart(Sex~., data = cats)
    

    改成這行

    cats_rpart_model <- rpart(Sex~., data = cats, minsplit=1, cp=1e-3)
    

    我們可以比較一下兩次的結果:

    很明顯看得出來,右邊雖然誤差可能比較小,但應該是已經overfit了。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    接下來我們測試iris data,只採用iris中的Petal.Length和Petal.Length兩個維度的Data。

    rm(list=ls(all=TRUE))
    data(iris)
    Iris_2D <- iris[,3:5]
    plot(Iris_2D[1:2], pch = 21, bg = c("red", "green3", "blue")[unclass(Iris_2D$Species)])
    
    library(rpart)
    Iris_2D_rpart_model <- rpart(Species~., data = Iris_2D)
    Iris_2D_rpart_pred <- predict(Iris_2D_rpart_model, Iris_2D)
    
    Iris_2D_rpart_pred_ClassN <- apply( Iris_2D_rpart_pred,1,function(one_row) return(which(one_row == max(one_row))))
    Iris_2D_rpart_pred_Class <- apply( Iris_2D_rpart_pred,1,function(one_row) return(colnames(Iris_2D_rpart_pred)[which(one_row == max(one_row))]))
    
    Iris_2D_Class_temp <- unclass(Iris_2D$Species)
    Iris_2D_Class <- attr(Iris_2D_Class_temp ,"levels")[Iris_2D_Class_temp]
    
    table(Iris_2D_rpart_pred_Class,Iris_2D_Class)
    
    plot(Iris_2D_rpart_model)
    text(Iris_2D_rpart_model)
    
    x1 <- seq(min(Iris_2D$Petal.Length), max(Iris_2D$Petal.Length), length = 50)
    x2 <- seq(min(Iris_2D$Petal.Width), max(Iris_2D$Petal.Width), length = 50)
    Feature_x1_to_x2 <- expand.grid(Petal.Length = x1, Petal.Width = x2)
    Feature_x1_to_x2_Class <- apply(predict(Iris_2D_rpart_model,Feature_x1_to_x2),1,
    	function(one_row) return(which(one_row == max(one_row))))
    
    plot(Iris_2D[1:2], pch = 21, bg = c("red", "green3", "blue")[unclass(Iris_2D$Species)])
    contour(x1,x2,matrix(Feature_x1_to_x2_Class,length(x1)),add = T, levels = c(1.5,2.5),labex = 0)
    

    同樣的,我們可以把第7行的model換成下面這行在run一次

    Iris_2D_rpart_model <- rpart(Species~., data = Iris_2D, minsplit=1, cp=1e-3)
    

    我們會得到:

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    最後,在rpart中也有類似像svm中那個tune的設計。可以直接在圖上畫出各種cp所train出來的model的精度。如下:(延續使用上方的iris作為例子)

    plotcp(Iris_2D_rpart_model)
    printcp(Iris_2D_rpart_model)
    

    會得到cp和error的一張圖,如下

    並且會在R的shell中看到以下的訊息:

    > printcp(Iris_2D_rpart_model)
    
    Classification tree:
    rpart(formula = Species ~ ., data = Iris_2D, minsplit = 1, cp = 0.001)
    
    Variables actually used in tree construction:
    [1] Petal.Length Petal.Width 
    
    Root node error: 100/150 = 0.66667
    
    n= 150 
    
         CP nsplit rel error xerror     xstd
    1 0.500      0      1.00   1.16 0.051277
    2 0.440      1      0.50   0.65 0.060690
    3 0.020      2      0.06   0.07 0.025833
    4 0.010      3      0.04   0.08 0.027520
    5 0.001      6      0.01   0.07 0.025833
    

    從圖上和訊息中,我們可以看出error隨著cp的縮小,而遞減的速度。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    上一篇: R上的CART Package — rpart [入門篇]

    下一篇:

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Posted in Classification and Regression, Data Mining / Machine Learning, R Programming | Leave a comment

    R上的LIBSVM Package — e1071 [參數篇]

    首先,讓我們快速Review一下SVM所解的Optimization Problem (Maximum-margin Criteria):

    所以,一個基本的SVM問題,大概會包含兩個主要的參數:\phi 以及 C 。

    解法上我們會解上面問題的Dual Problem,因此,我們會看到的就不是 \phi,而是 <\phi(x),\phi(y)> 也就是一般所謂的Kernel K(x,y)

    (值得注意的是,Kernel 是在Dual Problem中才會出現的,在Primal Problem會看到的是 Feature Map \phi 。)

    這邊點出了SVM Model中重要的兩個參數,kernel 和 cost (也就是上面的C)。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    在LIBSVM中,提供了四種kernel的選擇:

    • linear:K(u,v) = <u,v>
    • polynomial: K(u,v) = (\gamma <u,v> + coef0)^{degree} (參數:gamma, degree, coef0)
    • radial basis:K(u,v) = e^{\gamma |u-v|^2}(參數: gamma)
    • sigmoid:K(u,v) = \tanh(\gamma <u,v> + coef0) (參數:gamma, coef0)

    在e1071中svm的預設參數如下:

    kernel = "radial",
    degree = 3,
    gamma = if (is.vector(x)) 1 else 1 / ncol(x),
    coef0 = 0,
    cost = 1
    

    我們可以依照不同的問題,而選擇不同的參數來進行fit。不過要特別注意 overfit 的問題。就如同前文中的投影片所提到的,這裡會有一些Bias-Variance trade off / model selection的問題。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    底下我們會demo幾個例子,讓讀者感受一下不同kernel的作用:

    首先,使用MASS-cats data,比較 linear kernel 和 radial basis (RBF kernel)

    rm(list=ls(all=TRUE))
    library(MASS)
    data(cats)
    library(e1071)
    
    SVM_RBF_Model <- svm(Sex~., data = cats)
    plot(SVM_RBF_Model,data=cats,color.palette = topo.colors)
    
    SVM_Linear_Model <- svm(Sex~., data = cats,kernel="linear")
    plot(SVM_Linear_Model,data=cats,color.palette = topo.colors)
    

    結果如下:

    我們可以看到右邊的Linear kernel 就是找一個Linear hyperplane切開data, 而左邊的RBF kernel 則是經過kernel的作用可以做到nonlinear的效果。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    接下來,我們demo使用同一種參數,但使用不同的kernel參數會有甚麼效果呢?

    我們知道RBF的參數主要是gamma,因為cats data一共有144筆,所以內建的gamma是使用1/144 = 0.006944444。

    下面我們使用gamma = 10和100來做一些簡單的測試:

    我們可以看到,當我們將gamma放大的時候,會出現overfit的現象。

    對C (cost) 作改變的時候,也會有一些有趣的事情發生,這部分就留給讀者自己玩玩看囉!

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    最後,順帶一提,貼心的e1071 package中其實有附帶tune參數的指令:

    obj <- tune.svm(Sex~., data = cats, sampling = "fix", gamma = 2^c(-8,-4,0,4), cost = 2^c(-8,-4,-2,0))
    plot(obj, transform.x = log2, transform.y = log2)
    plot(obj, type = "perspective", theta = 120, phi = 45)
    
    obj
    

    我們會看到下面兩張圖:

    以及在R的shell中出現,最佳參數的訊息:

    > obj
    
    Parameter tuning of ‘svm’:
    
    - sampling method: 10-fold cross validation
    
    - best parameters:
     gamma cost
         1    1
    
    - best performance: 0.2161905
    

    以上是關於SVM一些初步的參數設定的問題和指令,感謝各位讀者的捧場^^

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    上一篇: R上的LIBSVM Package — e1071 [入門篇]

    下一篇:

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Posted in Classification and Regression, Data Mining / Machine Learning, R Programming | Leave a comment