日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你R语言做k均值聚类分析

發布時間:2023/12/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你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包,需要事先下載好,我們先導入數據和包

library(factoextra) library(dplyr) library(pacman) library(cluster) bc<-read.csv("E:/r/test/roulei.csv",sep=',',header=TRUE) names(bc)


數據有5個參數,energy代表食物能量(卡路里),protein蛋白質,fat脂肪,calcium鈣含量,iron鐵含量,豎排是各種肉的名字,我就不一一解釋了。

數據的變量差別很大,我們首先要把數據標準化,然后計算歐式距離

bc.scaled<-scale(bc[2:6])##標準化數據 d<-dist(bc.scaled)###計算歐氏距離


在K均值聚類分析中, K的個數(即分成幾類)這個參數非常重要,我們先用NbClust的投票功能來看看

這里顯示2,3類都有4次投票,即分層2類和3類都是可以的。
我們還可以使用cluster函數做增強k均值聚類分析,可以自己聚類,自動分類,在這里函數傾向于分成2類

km <- eclust(bc[2:6], "kmeans", nstart = 25) #聚類的散點圖


也可以通過fviz_gap_stat函數來投票

fviz_gap_stat(km$gap_stat) # 不同K值下Gap 統計圖,指導選擇最佳K值 fviz_silhouette(km) # 輪廓圖,每種聚類下面的分布情況


函數fviz_gap_stat也傾向分成2類


那么問題來了,我們到底應該分成2類還是3類呢,我們可以根據我們的臨床需要進行判斷,我們可以先把圖都做出來比較一下
2類的

set.seed(666) kmeans1<-kmeans(bc.scaled,centers=2,nstart = 25) fviz_cluster(object=kmeans1,data=bc[2:6],ellipse.type = "euclid",star.plot=T,repel=T,geom = ("point"),palette='jco',main="",ggtheme=theme_minimal())+theme(axis.title = element_blank())


3類的

kmeans1<-kmeans(bc.scaled,centers=3,nstart = 25) fviz_cluster(object=kmeans1,data=bc[2:6],ellipse.type = "euclid",star.plot=T,repel=T,geom = ("point"),palette='jco',main="",ggtheme=theme_minimal())+theme(axis.title = element_blank())

我們可以見到,分成3類后的第1類(紅色箭頭部分)雖然數據很少,但是離第3類還是很遠的,我個人覺得不應該被歸入第一類(個人看法),我們就先按3類來分看看。

summary(kmeans1) kmeans1$cluster kmeans1$size


上圖可以看到,各種肉類被分進了組,第一組2種,第二組9種,第三組16種
我們把數據集整理一下,如下圖,數據被我們分類整理了

aaa <- data.frame(bc[2:6], kmeans1$cluster) aaa<-arrange(aaa,kmeans1.cluster)


我們對每組的數據進行平均值統計

by_fenzu<-group_by(aaa,kmeans1.cluster) summarize(by_fenzu,energy=mean(energy),protein=mean(protein),fat=mean(fat),calcium=mean(calcium),iron=mean(iron))


由上圖我們可以得出每組數據的各類指標平均數,因此我們可知,第一種肉類含能量少,蛋白質少,脂肪少,屬于沒有什么營養的肉類。第二種肉類:能量很多,脂肪也很多,可以參考為油炸的高脂肪垃圾食品。第三種為:低熱量,高蛋白質,低脂肪,并且富含鈣的肉類,比較適合我們中國人的飲食理念和習慣。這樣得出的結論可以在飲食上給出建議。
我們還可以得出每組指標的密度分布情況:
先對數據分組

Data1 <- aaa[which(aaa$kmeans1.cluster == 1), ] Data2 <- aaa[which(aaa$kmeans1.cluster == 2), ] Data3 <- aaa[which(aaa$kmeans1.cluster == 3), ]

做能量的分布曲線

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")


脂肪的分布曲線

par(mfrow = c(1,3)) plot(density(Data1[, 3]), col = "red", main = "1.fat") plot(density(Data2[, 3]), col = "red", main = "2.fat") plot(density(Data3[, 3]), col = "red", main = "3.fat")


其他的指標也可以同理做出來,這里就不一一演示了
我們還可以通過散點圖矩陣,將每組的數據關系表示出來,并且以不同顏色區分

pairs(energy~protein+fat+calcium,data = aaa,pch = 21,bg = c("red", "green3", "blue")[unclass(aaa$kmeans1.cluster)])


.更多精彩文章請關注公眾號:零基礎說科研

總結

以上是生活随笔為你收集整理的手把手教你R语言做k均值聚类分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。