聚類分析簡單介紹(附R對應函數介紹)
來自專欄 R語言中文社區
作者:王亨 R語言中文社區專欄作者
個人公眾號:跟著菜鳥一起學R語言推薦課程:R語言可視化&商務圖表實戰課程
聚類分析是一種機器學習領域最常用的分類方法,它在在客戶分類,文本分類,基因識別,空間數據處理,衛星圖片處理,醫療圖像自動檢測等領域有著廣泛應用。聚類就是將相同,相似的對象劃分到同一個組中,聚類分析事前不需要參考任何分類信息,可以通過判斷數據表特徵的相似性來完成對數據的歸類。在聚類分析中,觀測值的類別一般情況下是未知的。我們希望將觀測值聚類為合適的幾個分類。聚類在機器學習中就是無監督學習。今天來介紹一下下面的五種聚類方法和對於R裡面的函數。
- K-均值聚類(K-Means)
- K-中心點聚類(K-Medoids)
- 系譜聚類(HC)
- 密度分析(DBSCAN)
- 期望最大化聚類(EM)
聚類演算法思想
K-均值聚類
K均值法:又稱快速聚類法,有時也稱扁平聚類。將n個對象分成k個簇,簇內高度相似,簇間較低相似。它並不知道訓練集中的觀測值的類別,它以觀測值之間的距離作為度量觀測值相似程度的指標,使用迭代的方法訓練模型,它和KNN都具有計算簡潔的優點,他們同樣受聚類個數和初始分布的影響。它的思想是以隨機選取的K個樣本作為簇的起始中心點或簇的平均值,各個簇中心點的距離,將該對象賦給最近的簇,再計算每個簇的平均值,然後不斷重複,直至所有樣本所屬類為中心。該演算法的缺點是易受異常值的干擾。
K-中心點聚類
由於K-均值演算法易受極值影響,為了改進這一點缺點,就提出來K-中心點演算法。K-均值演算法是在當前簇中樣本坐標的均值為新的中心點。K-中心點演算法在選擇各類別中心點時不選取樣本均值點,而是選擇簇內的每個對象為中心,使得總的代價減少或最小即可。它類別內選取到其餘樣本距離之和最小的樣本為中心,這也保證了總的代價最小。但這也增加了演算法的複雜度。K-中心聚類的魯棒性更好。
系譜聚類
系譜聚類的主要特點是不需要事先設定類別數K,它在每次迭代過程中僅將距離最近的兩個樣本或簇聚為一類,其過程自然得到k=1至k=n(n為待分類樣本總數)個類別的聚類結果。
密度聚類
DBSCAN演算法是基於密度的聚類方法中最常用的代表方法之一該演算法將分布稠密的樣本劃分到同一個簇,並過濾掉那些低密度的區域。可以在有雜訊的數據中形成任意形狀的簇,彌補了前幾種演算法易受異常值干擾的缺點,因此可以發現各種任意形狀的聚類簇。但他也有缺點,就是對定義的半徑和密度閾值敏感,稍有不同,結果也會不一樣,只能不斷調整參數。
期望最大化聚類
期望最大化演算法,簡稱EM演算法。該演算法在聚類時,它將數據集看作一個含有隱形變數的概率模型,並實現模型最優化。通過「反覆估計 」這也迭代找出最優解,每一次迭代包含兩步:第一步求期望值,稱為E步,第二步求極大值,稱為M步,同時給出相應的最優類別數k。kmeans聚類計算的是距離,該聚類是計算概率。
代碼
K-均值演算法
kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"), trace=FALSE)
K-中心演算法
實現K-中心演算法的函數時pam(),它在cluster包裡面。這個函數的參數比較多。
pam(x, k, diss = inherits(x, "dist"), metric = "euclidean", medoids = NULL, stand = FALSE, cluster.only = FALSE, do.swap = TRUE, keep.diss = !diss && !cluster.only && n < 100, keep.data = !diss && !cluster.only, pamonce = FALSE, trace.lev = 0)
DBSCAN演算法
DBSCAN包裡面的dbscan()函數實現了DBSCAN演算法,函數具體為:
dbscan(data, eps, MinPts = 5, scale = FALSE, method = c("hybrid", "raw", "dist"), seeds = TRUE, showplot = FALSE, countmode = NULL)
EM聚類演算法
在mclust擴展包裡面提供了幾個函數,Mclust,mclustBIC,mclust2Dplot,densityMclust函數。
Mclust(data, G = NULL, modelNames = NULL, prior = NULL, control = emControl(), initialization = NULL, warn = mclust.options("warn"), x = NULL, verbose = interactive(), ...)
系譜聚類
在stats擴展包裡面有三個函數可以進行系譜聚類,每個函數都略有區別。
- hclust()函數
hclust(d, method = "complete", members = NULL)
2. cutree函數cutree函數則是對hclust函數的聚類結果進行剪枝。即選擇輸出指定類別數的系譜聚類結果。剪枝就是說輸出指定指定類別數的系譜聚類結果。
cutree(tree, k = NULL, h = NULL)
3. rect.hlcust函數該函數可以對結果進行可視化展現。它是在plot形成的系譜圖中指定類別中樣本分支並用方框表示出了。
rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2, cluster = NULL)
推薦閱讀:
※打造你的機器學習團隊:三種模式和角色分工
※《Python數據挖掘》筆記(二)關聯規則挖掘
※機器學習/數據挖掘面試總結
※2017 CCF ADL會議總結