手把手教你R语言做k均值聚类分析
今天聊聊k均值聚類分析,我們先要知道什么是類,在大數據時代,我們每個人都被打上很多個性標簽,比如:宅男,月光族,手機控,非主流等等,每個標簽都可以算是一個類,因此,可以不嚴謹的說:類是一些有特殊屬性個體的集合。而聚類分析的目的,就是要把這些個人找出來并區別出來,聚類分析屬于無監督機器學習的一個重要內容,今天我們來聊聊K均值聚類分析,那么k均值聚類分析和之前的層級聚類分析有什么不同呢?
K-Means算法是發展最成熟且原理簡單、算法流程清晰,經典算法的步驟描述,分為如下5步完成。
①隨機選取K個樣本作為n個樣本點類中心center_K;
②計算各樣本點plot (x[i], y[i])與各類中心cen?ter_K的距離;
③將各樣本歸于最近的類中心點;
④求各類的樣本的均值,作為新的類的中心center_K_new;
⑤判定:若類中心不再發生變動或達到迭代次數,算法結束,否則回到第②步。
如圖下圖所示: 在圖中一共有a至e這5個數據以及2個隨機的質心點(灰色點)。圖
3(a)為算法經過初始化后的狀態, 圖3(b)和圖3(d)是兩個更新過程, 圖3?和圖3(e)是兩個更新后的狀態。經過2輪更新該算法達到穩定如圖3(e)所示。
我們繼續使用之前的肉類數據(關注公眾號回復:肉類數據可以獲得該數據)來進行k均值聚類分析,需要factoextra,dplyr,pacman,cluster包,需要事先下載好,我們先導入數據和包
數據有5個參數,energy代表食物能量(卡路里),protein蛋白質,fat脂肪,calcium鈣含量,iron鐵含量,豎排是各種肉的名字,我就不一一解釋了。
數據的變量差別很大,我們首先要把數據標準化,然后計算歐式距離
在K均值聚類分析中, K的個數(即分成幾類)這個參數非常重要,我們先用NbClust的投票功能來看看
這里顯示2,3類都有4次投票,即分層2類和3類都是可以的。
我們還可以使用cluster函數做增強k均值聚類分析,可以自己聚類,自動分類,在這里函數傾向于分成2類
也可以通過fviz_gap_stat函數來投票
函數fviz_gap_stat也傾向分成2類
那么問題來了,我們到底應該分成2類還是3類呢,我們可以根據我們的臨床需要進行判斷,我們可以先把圖都做出來比較一下
2類的
3類的
我們可以見到,分成3類后的第1類(紅色箭頭部分)雖然數據很少,但是離第3類還是很遠的,我個人覺得不應該被歸入第一類(個人看法),我們就先按3類來分看看。
summary(kmeans1) kmeans1$cluster kmeans1$size
上圖可以看到,各種肉類被分進了組,第一組2種,第二組9種,第三組16種
我們把數據集整理一下,如下圖,數據被我們分類整理了
我們對每組的數據進行平均值統計
由上圖我們可以得出每組數據的各類指標平均數,因此我們可知,第一種肉類含能量少,蛋白質少,脂肪少,屬于沒有什么營養的肉類。第二種肉類:能量很多,脂肪也很多,可以參考為油炸的高脂肪垃圾食品。第三種為:低熱量,高蛋白質,低脂肪,并且富含鈣的肉類,比較適合我們中國人的飲食理念和習慣。這樣得出的結論可以在飲食上給出建議。
我們還可以得出每組指標的密度分布情況:
先對數據分組
做能量的分布曲線
par(mfrow = c(1,3)) plot(density(Data1[, 1]), col = "red", main = "1.energy") plot(density(Data2[, 1]), col = "red", main = "2.energy") plot(density(Data3[, 1]), col = "red", main = "3.energy")
脂肪的分布曲線
其他的指標也可以同理做出來,這里就不一一演示了
我們還可以通過散點圖矩陣,將每組的數據關系表示出來,并且以不同顏色區分
.更多精彩文章請關注公眾號:零基礎說科研
總結
以上是生活随笔為你收集整理的手把手教你R语言做k均值聚类分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你为何会有中年危机感?”40岁失业”是一
- 下一篇: 测试用例-微信消息撤回