聚類分析算法很多,比較經典的有k-means和層次聚類法。
k-means聚類分析算法
k-means的k就是最終聚集的簇數,這個要你事先自己指定。k-means在常見的機器學習算法中算是相當簡單的,基本過程如下:
- 首先任取k個樣本點作為k個簇的初始中心;
- 對每一個樣本點,計算它們與k個中心的距離,把它歸入距離最小的中心所在的簇;
- 等到所有的樣本點歸類完畢,重新計算k個簇的中心;
- 重複以上過程直至樣本點歸入的簇不再變動。
k-means的聚類過程示範如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN5IjMiJjMwETOwImZjRTYmRGMiVWY1QWY4ITM5MjY58CX5EzLcVDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.png)
k-means聚類過程
k-means聚類分析的原理雖然簡單,但缺點也比較明顯:
- 首先聚成幾類這個k值你要自己定,但在對資料一無所知的情況下你自己也不知道k應該定多少;
- 初始質心也要自己選,而這個初始質心直接決定最終的聚類效果;
- 每一次疊代都要重新計算各個點與質心的距離,然後排序,時間成本較高。
值得一提的是,計算距離的方式有很多種,不一定非得是笛卡爾距離;計算距離前要歸一化。
層次聚類法
盡管k-means的原理很簡單,然而層次聚類法的原理更簡單。它的基本過程如下:
- 每一個樣本點視為一個簇;
- 計算各個簇之間的距離,最近的兩個簇聚合成一個新簇;
- 重複以上過程直至最後隻有一簇。
層次聚類不指定具體的簇數,而隻關注簇之間的遠近,最終會形成一個樹形圖。
層次聚類示例
通過這張樹形圖,無論想劃分成幾個簇都可以很快地劃出。
以下以癌細胞細據為例,示範K-means和層次聚類法的過程。
nci.labels = NCI60$labs
nci.data = NCI60$data
sd.data = scale(nci.data)
data.dist = dist(sd.data)
plot(hclust(data.dist),labels = nci.labels, main = "Complete Linkage", xlab = "", sub = "", ylab = "") # 預設按最長距離聚類
plot(hclust(data.dist,method = "average"),labels = nci.labels, main = "Average Linkage", xlab = "", sub = "", ylab = "") # 類平均法
> plot(hclust(data.dist),labels = nci.labels, main = "Single Linkage", xlab = "", sub = "", ylab = "") #最短距離法
Complete Linkage
Average Linkage
Single Linkage
可見選擇不同的距離名額,最終的聚類效果也不同。其中最長距離和類平均距離用得比較多,因為産生的譜系圖較為均衡。
> # 指定聚類數
> hc.out = hclust(dist(sd.data))
> hc.clusters = cutree(hc.out,4)
> plot(hc.out,labels = nci.labels) > abline(h=139,col="red") # 切割成4類
層次聚類劃分成4類
圖中一條紅線将簇劃分成4類,很容易看出哪些樣本各屬于哪一簇。
以上是層次聚類法的結果,但如果用k-means聚類的話,結果很可能就不一樣了。
> # k-means聚類
> set.seed(2)
> km.out = kmeans(sd.data,4,nstart = 20)
> km.clusters = km.out$cluster
> table(km.clusters,hc.clusters) # 兩種聚類結果的确有差異,k-means的第2簇與層次聚類的第3簇一緻
最受歡迎的見解
1.R語言k-Shape算法股票價格時間序列聚類
2.R語言中不同類型的聚類方法比較
3.R語言對用電負荷時間序列資料進行K-medoids聚類模組化和GAM回歸
4.r語言鸢尾花iris資料集的層次聚類
5.Python Monte Carlo K-Means聚類實戰
6.用R進行網站評論文本挖掘聚類