Content
9. Clusteringgit
9.1 Supervised Learning and Unsupervised Learninggithub
9.2 K-means algorithm(代碼地址:https://github.com/llhthinker/MachineLearningLab/tree/master/K-Means)算法
9.3 Optimization objective網絡
9.4 Random Initializationdom
9.5 Choosing the Number of Clusters 機器學習
咱們已經學習了許多機器學習算法,包括線性迴歸,Logistic迴歸,神經網絡以及支持向量機。這些算法都有一個共同點,即給出的訓練樣本自身帶有標記。好比,使用線性迴歸預測房價時,咱們所使用的每個訓練樣本是一個或多個變量(如面積,樓層等)以及自身帶有的標記即房價。而使用Logistic迴歸,神經網絡和支持向量機處理分類問題時,也是利用訓練樣本自身帶有標記即種類,例如進行垃圾郵件分類時是利用已有的垃圾郵件(標記爲1)和非垃圾郵件(標記爲0),進行數字識別時,變量是每一個像素點的值,而標記是數字自己的值。咱們把使用帶有標記的訓練樣本進行學習的算法稱爲監督學習(Supervised Learning)。監督學習的訓練樣本能夠統一成以下形式,其中x爲變量,y爲標記。函數
顯然,現實生活中不是全部數據都帶有標記(或者說標記是未知的)。因此咱們須要對無標記的訓練樣本進行學習,來揭示數據的內在性質及規律。咱們把這種學習稱爲無監督學習(Unsupervised Learning)。因此,無監督學習的訓練樣本以下形式,它僅包含特徵量。學習
圖9-1形象的表示了監督學習與無監督學習的區別。圖(1)表示給帶標記的樣本進行分類,分界線兩邊爲不一樣的類(一類爲圈,另外一類爲叉);圖(2)是基於變量x1和x2對無標記的樣本(表面上看起來都是圈)進行聚類(Clustering)。優化
圖9-1 一個監督學習與無監督學習的區別實例 spa
無監督學習也有不少應用,一個聚類的例子是:對於收集到的論文,根據每一個論文的特徵量如詞頻,句子長,頁數等進行分組。聚類還有許多其它應用,如圖9-2所示。一個非聚類的例子是雞尾酒會算法,即從帶有噪音的數據中找到有效數據(信息),例如在嘈雜的雞尾酒會你仍然能夠注意到有人叫你。因此雞尾酒會算法能夠用於語音識別(詳見wikipedia)。
quora上有更多關於監督學習與無監督學習之間的區別的討論。
圖9-2 一些聚類的應用
聚類的基本思想是將數據集中的樣本劃分爲若干個一般是不相交的子集,每一個子集稱爲一個"簇"(cluster)。劃分後,每一個簇可能有對應的概念(性質),好比根據頁數,句長等特徵量給論文作簇數爲2的聚類,可能獲得一個大部分是包含碩士畢業論文的簇,另外一個大部分是包含學士畢業論文的簇。
K均值(K-means)算法是一個普遍使用的用於簇劃分的算法。下面說明K均值算法的步驟:
圖9-3演示了以特徵量個數和簇數K均爲2的狀況。
圖9-3 K均值算法的演示
經過上述描述,下面咱們形式化K均值算法。
輸入:
算法:
Randomly initialize K cluster centroids
Repeat {
for i = 1 to m
:= index (from 1 to K ) of cluster centroid closest to
for k = 1 to K
:= average (mean) of points assigned to cluster
}
上述算法中,第一個循環對應了簇分配的步驟:咱們構造向量c,使得c(i)的值等於x(i)所屬簇的索引,即離x(i)最近簇中心的索引。用數學的方式表示以下:
第二個循環對應移動簇中心的步驟,即移動簇中心到該簇的平均值處。更數學的方式表示以下:
其中都是被分配給簇
的樣本。
若是有一個簇中心沒有分配到一個樣本,咱們既能夠從新初始化這個簇中心,也能夠直接將其去除。
通過若干次迭代後,該算法將會收斂,也就是繼續迭代不會再影響簇的狀況。
在某些應用中,樣本可能比較連續,看起來沒有明顯的簇劃分,可是咱們仍是能夠用K均值算法將樣本分爲K個子集供參考。例如根據人的身高和體重劃分T恤的大小碼,如圖9-4所示。
圖9-4 K-means for non-separated clusters
從新描述在K均值算法中使用的變量:
= index of cluster (1,2,…, K ) to which example
is currently assigned
= cluster centroid k (
)
= cluster centroid of cluster to which example
has been assigned
使用這些變量,定義咱們的cost function以下:
因此咱們的優化目標就是
結合9.2節所描述的算法,能夠發現:
注意,在K均值算法中,cost function不可能能增長,它應該老是降低的(區別於梯度降低法)。
下面介紹一種值得推薦的初始化簇中心的方法。
K均值算法可能陷入局部最優。爲了減小這種狀況的發生,咱們能夠基於隨機初始化,屢次運行K均值算法。因此,算法變成以下形式(以運行100次爲例:效率與準確性的tradeoff)
For i = 1 to 100 {
Randomly initialize K-means.
Run K-means. Get
![]()
Compute cost function (distortion)
![]()
}
Pick clustering that gave lowest cost
![]()
選擇K的取值一般是主觀的,不明確的。也就是沒有一種方式確保K的某個取值必定優於其餘取值。可是,有一些方法可供參考。
The elbow method : 畫出代價J關於簇數K的函數圖,J值應該隨着K的增長而減少,而後趨於平緩,選擇當J開始趨於平衡時的K的取值。如圖9-5的(1)所示。
可是,一般這條曲線是漸變的,沒有很顯然的"肘部"。如圖9-5的(2)所示。
圖9-5 代價J關於簇數K的曲線圖
注意:隨着K的增長J應該老是減小的,不然,一種出錯狀況多是K均值陷入了一個糟糕的局部最優。
一些其餘的方法參見wikipedia。
固然,咱們有時應該根據後續目的( later/downstream purpose )來肯定K的取值。仍是以根據人的身高和體重劃分T恤的大小碼爲例,若咱們想將T恤大小劃分爲S/M/L這3種類型,那麼K的取值應爲3;若想要劃分爲XS/S/M/L/XL這5種類型,那麼K的取值應爲5。如圖9-6所示。
圖9-6 劃分T恤size的兩種不一樣狀況
【推薦閱讀】討論K均值算法的缺點