台灣的 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
台灣的 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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
請問一下各位讀者,如果要將下圖的Data分群的話,你會把它分成幾群 (Cluster) 呢?? 怎麼分??
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Clustering Analysis的問題,顧名思義就是要在Data之中進行分群的動作。典型的問題大致如上圖,圖中有 “兩群” Data,而我們需要找個辦法把這兩群Data分開,方法有非常非常多種,下面將會慢慢的介紹。
除了分開的方法外,Clustering Analysis中還有另一個極困難的問題,就是在Data中一共應該分成幾群?比方說上面的圖中就應該是有 “兩群” ,而在下面的數字中,就應該分成 “四群”,一個數字成一個cluster才對。
除了群數不同以外,顯然我們很直覺得可以感受到,用來分數字的方法也絕對和用來分第一個圖的方法會非常非常的不一樣。第一個圖的兩個 群(Cluster) 都具有圓對稱的特性,而第二個卻是彎來彎去的形狀。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
簡單的整理一下,Clustering Analysis的問題中須要考慮的重要問題有兩個:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
「一共有幾群?」是model selection的問題,等之後寫道model selection部分的學習筆記的時候,會再詳細討論。在這裡,我們先討論如何把不同的群分開的方法。
方法有很多種,依照是否有機率模型在背後,可分為 model-based 或 algorithm-based;另外,也可以按照 linear 或 non-liner 來分類。
Algorithm Based Methods:
(此動畫為k-means演算法,分類2D上3個clusters的問題)
Model Based Methods:
Non-Linear Methods:
To be continued
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
相關文章:
To be continued
Dimension Reduction,顧名思義,就是原本的Data寫在一個比較高的維度作標上,我們希望找到一個低維度的作標來描述它,但又不能失去Data本身的特質。
底下我們來看個例子,這是一條線上的一些點
Data是寫在兩維的平面 上,但其實用把它投影在紅色箭頭的方向上,一個個變數就可以完成的描述Data了。
當然,我們真時遇到的Data可能不會像上面這麼完美。我們稍微對上面的Data稍微加一點noise,如下:
仔細觀察一下這兩個方向:
因此,我們大概可以歸納出
“尋找讓Data投影上去,散最開的方向!”
這樣的結論。它是PCA的其中一種Approach的方向,另一種Approach的方式是用Least Square也可以導出同樣的效果。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在看完簡單的例子後,我們來看一下,在Dimension Reduction的發展過程中,大概有幾個主要的方展方像呢?
大致上筆者是分成三大類:
Unsupervised Dimension Reduction:
Supervised Dimension Reduction:
Geometric (Manifold) Learning:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
而三個大方向,各自又有哪些常用的方法呢?
Unsupervised Dimension Reduction:
Supervised Dimension Reduction:
Geometric (Manifold) Learning:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
相關文章:
To be continued.
「要如何知道明天溫度大概幾度呢?」、「要如何分辨橘子和蘋果呢?」、「明天股市會漲還是會跌呢?」、……等等。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
舉凡這類型的問題,大概都可以算是Supervised Learning的範疇。大概就是有一個我們想知道的結果 — Output/Label (例子中的溫度,蘋果或橘子,漲或跌,……);然後我們必須拿一些東西 (Input/Feature) 想辦法去猜出這些我們想知道的東西,比方說我們可能會想拿歷史溫度、溼度、風速、…等等去猜明天的溫度,拿顏色和形狀去猜水果,拿歷史股價去猜股市。
值得一提的是,在真實的問題中,要如何選到好的Input也是一門很大學問 (Feature Selection)。一般而言都和實作經驗有很大的關係,有越多的Domain Knowledge會作的越好。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supervised Learning的工作是在當我們選好了Input和Output後,有系統的建後出一個Predictor (Classifier) 以便之後進行預測的工作。
換成比教數學的語言說,就是當我們選好Input,Output: 之後,我們會希望找到一個函數 ,使得
依照 的性質的不同,又可以將問題分成:Regression () 和 Classfication ()。
比方說溫度的問題就是Regression的問題,而後面兩的問題就是Classification的問題。不過, 這個分類並沒有那麼硬性,而且許多方法是可以在兩邊同時使用的;比方說第三個問題好了,如果你想知道「明天會漲跌幾點?」那又會變成Regression的問題。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
常見的Classification Methods:
常見的Regression Methods:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
相關文章:
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.
如果,我們曾經很發心的想要幫助別人改正他們的問題,雖然加行不夠善巧,導致對方稍起煩惱,但利他的心,的的確確可能讓這份善業的果報回到我們身上。
不過,常常卻由於自己的無明或執著,在果位上沒看到別人糾正我們,那份想幫助我們的發心,也沒看到這可能是自己之前所造的善業所感的善果。
一念的執著,卻浪費了別人的發心,也浪費了自己之前的善業。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有一個人生病了,病的很苦,住在醫院中,躺在病床上動彈不得。很多事情都不太能自己作,很多想做的事情都不能作。不能像之前一樣蹦蹦跳跳,不能去公園散步,不能去旅遊,不能陪家人聊天…等等。這病人有一個學佛的朋友,有一天這位朋友帶了一群友人去看這病人。
到了醫院,這位學佛的有人,看到這病人的種種苦受。居然開始對他的朋友們宣說病苦…宣說三惡趣苦,就是像病苦一般的不自在,什麼都不能自主,自己想作什麼都不行作。並且宣說:只有三寶有救怙能力。
最後,那群朋友,覺得自己又學到了新東西,很高興的離開了。或許,他們也很感謝那位病人所示現的病相,也很感謝那位學佛的朋友,所述說的道理。但是……
各位…如果您是那位病人,你會很歡喜的感到:「真是太好了,原來我的病痛還可以讓這麼多人生起對三寶的信心,還可以讓這麼多人真實了解病苦。這病痛真是太值得了,可以讓我以往的惡業,變成善業,來幫助大家,真是太感謝那位學佛的朋友了!太感謝大家的精進學習了!」
還是說,你心裡會想:「XXX…人家已經很痛苦了,你們是不會體諒一下喔!還在別人傷口上灑鹽…一直強調那些我想做但現在都無法作的事情。對啦!我就是之前造惡業,所以,才會現在生病在這裡。都已經這麼苦了!你們幹嘛還一直消費我???」
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
當我們引用他人的苦受,述說佛法的時候。我們是否也曾經想過:
相信,看了這系列的文章後,讀者應該對Dimension Reduction和PCA都有些基本的認識了。接下來,讓我們進入實作的成面。
下面,我們將介紹R的兩個內建計算PCA的指令 — princomp / prcomp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先,我們先測試最簡單的直線的data。
整個Data躺在 這條直線上。其中 。
如下方的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
其中,比較常使用的,如下:
~~~~~~~~~~~~~~~~~~~~~~
(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如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回Topic: Introduction to Dimension Reduction
上一篇:
下一篇: R的內建PCA指令 — princomp / prcomp [簡單的例子]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在 rpart model 中大概有幾個比較重要的參數:
以上是rpart的參數部分,大部份都是集中在選擇model和data的權重上。一旦決定方法後,在model中的重要參數,大部分都是在control中用一個rpart.control的物件進行設定的。
接下來我們來介紹 rpart.control中的幾個重要參數:
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 [入門篇]
下一篇:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先,讓我們快速Review一下SVM所解的Optimization Problem (Maximum-margin Criteria):
所以,一個基本的SVM問題,大概會包含兩個主要的參數: 以及 C 。
解法上我們會解上面問題的Dual Problem,因此,我們會看到的就不是 ,而是 也就是一般所謂的Kernel 。
(值得注意的是,Kernel 是在Dual Problem中才會出現的,在Primal Problem會看到的是 Feature Map 。)
這邊點出了SVM Model中重要的兩個參數,kernel 和 cost (也就是上面的C)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在LIBSVM中,提供了四種kernel的選擇:
在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 [入門篇]
下一篇:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~