R語言實(shí)現(xiàn)KMeans聚類算法實(shí)例教程
本文和你一起學(xué)習(xí)無監(jiān)督機(jī)器學(xué)習(xí)算法 ———— kmeans算法,并在R中給詳細(xì)的實(shí)現(xiàn)示例和步驟。
什么是k-means聚類算法
聚類是從數(shù)據(jù)集中對(duì)觀測值進(jìn)行聚類的機(jī)器學(xué)習(xí)方法。它的目標(biāo)是聚類相似觀測值,不同類別之間差異較大。聚類是一種無監(jiān)督學(xué)習(xí)方法,因?yàn)樗鼉H嘗試從數(shù)據(jù)集中發(fā)現(xiàn)結(jié)構(gòu),而不是預(yù)測應(yīng)變量的值。
下面是一個(gè)市場營銷中對(duì)客戶分類的場景,通過下面客戶信息:
- 家庭收入
- 住房面積
- 戶主職業(yè)
- 據(jù)城區(qū)距離
我們利用這些信息進(jìn)行聚類,可識(shí)別相似家庭,從而能夠識(shí)別某類型家庭可能購買某種產(chǎn)品或?qū)δ撤N類型的廣告反應(yīng)更好。
最常用的聚類算法就是k-means聚類算法,下面我們介紹k-means算法并通過示例進(jìn)行說明。
k-means聚類算法把數(shù)據(jù)集中每個(gè)觀測值分為K個(gè)類別。每個(gè)分類中的觀測值相當(dāng)類似,K類之間彼此差異較大。實(shí)際應(yīng)用中執(zhí)行下列幾步實(shí)現(xiàn)k-means聚類算法:
1.確定K值
首先確定把數(shù)據(jù)集分為幾類。通常我們簡單測試幾個(gè)不同值K,然后分析結(jié)果,確定那個(gè)值更有現(xiàn)實(shí)意義。
2.將每個(gè)觀察結(jié)果隨機(jī)分配到一個(gè)初始簇中,從1到K。
3.執(zhí)行以下步驟,直到集群分配停止變化。
對(duì)于K個(gè)集群中的每一個(gè),計(jì)算集群的質(zhì)心。這僅僅是第k個(gè)簇中觀測的p特征的向量。
將每個(gè)觀測值分配到質(zhì)心最近的簇中。在這里最接近的是用歐氏距離來定義的。
下面通過示例展示R的實(shí)現(xiàn)過程。
R 實(shí)現(xiàn)kmeans聚類算法
加載包
首先加載兩個(gè)包,包括kmeans算法的一些輔助函數(shù)。
library(factoextra) library(cluster)
加載示例數(shù)據(jù)
對(duì)于本例我們將使用R中內(nèi)置的usarrest數(shù)據(jù)集,該數(shù)據(jù)集包含1973年美國每個(gè)州每10萬居民因謀殺、襲擊和強(qiáng)奸而被捕的人數(shù),以及每個(gè)州居住在城市地區(qū)的人口百分比(UrbanPop)。
#load data df <- USArrests #remove rows with missing values df <- na.omit(df) #scale each variable to have a mean of 0 and sd of 1 df <- scale(df) #view first six rows of dataset head(df) # Murder Assault UrbanPop Rape # Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473 # Alaska 0.50786248 1.1068225 -1.2117642 2.484202941 # Arizona 0.07163341 1.4788032 0.9989801 1.042878388 # Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602 # California 0.27826823 1.2628144 1.7589234 2.067820292 # Colorado 0.02571456 0.3988593 0.8608085 1.864967207
上面代碼首先加載USArrests
數(shù)據(jù)集,刪除缺失值,對(duì)數(shù)據(jù)值進(jìn)行標(biāo)準(zhǔn)化。
尋找最佳聚類數(shù)量
執(zhí)行kmeans聚類算法,我們可以使用內(nèi)置包stat中的kmeans()函數(shù),語法如下:
kmeans(data, centers, nstart)
- data : 數(shù)據(jù)集名稱
- centers: 聚類數(shù)量,即選擇k的值
- nstart: 初始配置個(gè)數(shù)。因?yàn)椴煌某跏紗?dòng)集合可能會(huì)導(dǎo)致不同的結(jié)果,所以建議使用幾種不同的初始配置。k-means算法將找到導(dǎo)致簇內(nèi)變異最小的初始配置。
既然在使用kmeans函數(shù)之前并不確定最優(yōu)聚類數(shù)量,下面通過兩個(gè)圖來輔助我們決定:
1.聚類數(shù)量 vs. 總體平方和
首先使用 fviz_nbclust 函數(shù)創(chuàng)建一個(gè)圖,展示聚類數(shù)量及總體平方和之間的關(guān)系:
fviz_nbclust(df, kmeans, method = "wss")
通常我們創(chuàng)建這類圖形尋找某個(gè)K類對(duì)應(yīng)的平方和值開始彎曲或趨于平緩的肘形。這通常是最理想的聚類數(shù)量。上圖中顯然在k = 4個(gè)時(shí)出現(xiàn)肘形。
2.聚類數(shù)量 vs. 差距統(tǒng)計(jì)
另一個(gè)決定最佳聚類數(shù)量的是使用指標(biāo):差距統(tǒng)計(jì)。它用于比較不同k值聚類差距變化情況。使用cluster包中的clusGap()
以及fviz_gap_stat()
函數(shù)畫圖:
#calculate gap statistic based on number of clusters gap_stat <- clusGap(df, FUN = kmeans, nstart = 25, K.max = 10, B = 50) #plot number of clusters vs. gap statistic fviz_gap_stat(gap_stat)
從上圖可以看到k=4時(shí),差距統(tǒng)計(jì)最大,這與前面圖的結(jié)果一致。
使用最優(yōu)k執(zhí)行kmeans聚類
最后,我們執(zhí)行kmeans函數(shù),使用k=4作為最優(yōu)值:
# 設(shè)置隨機(jī)種子,讓結(jié)果可以重現(xiàn) set.seed(1) # 調(diào)用kmeans聚類算法 k = 4 km <- kmeans(df, centers = 4, nstart = 25) # 查看結(jié)果 km # Show in New Window # Clustering k = 1,2,..., K.max (= 10): .. done # Bootstrapping, b = 1,2,..., B (= 50) [one "." per sample]: # .................................................. 50 # R Console # # # Show in New Window # K-means clustering with 4 clusters of sizes 13, 13, 16, 8 # # Cluster means: # Murder Assault UrbanPop Rape # 1 -0.9615407 -1.1066010 -0.9301069 -0.96676331 # 2 0.6950701 1.0394414 0.7226370 1.27693964 # 3 -0.4894375 -0.3826001 0.5758298 -0.26165379 # 4 1.4118898 0.8743346 -0.8145211 0.01927104 # # Clustering vector: # Alabama Alaska Arizona Arkansas California Colorado # 4 2 2 4 2 2 # Connecticut Delaware Florida Georgia Hawaii Idaho # 3 3 2 4 3 1 # Illinois Indiana Iowa Kansas Kentucky Louisiana # 2 3 1 3 1 4 # Maine Maryland Massachusetts Michigan Minnesota Mississippi # 1 2 3 2 1 4 # Missouri Montana Nebraska Nevada New Hampshire New Jersey # 2 1 1 2 1 3 # New Mexico New York North Carolina North Dakota Ohio Oklahoma # 2 2 4 1 3 3 # Oregon Pennsylvania Rhode Island South Carolina South Dakota Tennessee # 3 3 3 4 1 4 # Texas Utah Vermont Virginia Washington West Virginia # 2 3 1 3 3 1 # Wisconsin Wyoming # 1 3 # # Within cluster sum of squares by cluster: # [1] 11.952463 19.922437 16.212213 8.316061 # (between_SS / total_SS = 71.2 %) # # Available components: # # [1] "cluster" "centers" "totss" "withinss" "tot.withinss" # [6] "betweenss" "size" "iter" "ifault"
從結(jié)果可見:
- 16 州分在第一個(gè)類
- 13 州分在第二個(gè)類
- 13 州分在第三個(gè)類
- 8 州分在第四個(gè)類
我們可以通過fviz_cluster()
函數(shù)在二維空間中以散點(diǎn)圖方式展示結(jié)果:
#plot results of final k-means model fviz_cluster(km, data = df)
也可以使用aggregate()函數(shù)查看每個(gè)類中變量的均值:
#find means of each cluster aggregate(USArrests, by=list(cluster=km$cluster), mean) # cluster Murder Assault UrbanPop Rape # # 1 3.60000 78.53846 52.07692 12.17692 # 2 10.81538 257.38462 76.00000 33.19231 # 3 5.65625 138.87500 73.87500 18.78125 # 4 13.93750 243.62500 53.75000 21.41250
輸出結(jié)果解釋如下:
- 在第一類中的州中平均每100,000人謀殺數(shù)為 3.6
- 在第一類中的州中平均每100,000人襲擊數(shù)為 78.5
- 在第一類中的州中平均每100,000人城區(qū)居民率為 52.1%
- 在第一類中的州中平均每100,000人強(qiáng)奸數(shù)為 3.6 12.2
最后我們把聚類結(jié)果附加到原始數(shù)據(jù)集中:
#add cluster assigment to original data final_data <- cbind(USArrests, cluster = km$cluster) #view final data head(final_data) # Murder Assault UrbanPop Rape cluster # # Alabama 13.2 236 58 21.2 4 # Alaska 10.0 263 48 44.5 2 # Arizona 8.1 294 80 31.0 2 # Arkansas 8.8 190 50 19.5 4 # California 9.0 276 91 40.6 2 # Colorado 7.9 204 78 38.7 2
kmeans 算法的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
很快的算法能夠處理大數(shù)據(jù)集
缺點(diǎn):
在執(zhí)行算法之前需要指定聚類數(shù)量對(duì)異常值敏感 總結(jié)
本文我們討論了kmeans算法的概念,并在R中給詳細(xì)實(shí)現(xiàn)示例和步驟。
總結(jié)
到此這篇關(guān)于R語言實(shí)現(xiàn)KMeans聚類算法教程的文章就介紹到這了,更多相關(guān)R語言KMeans聚類算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語言 install.packages 無法讀取索引的解決方案
這篇文章主要介紹了R語言 install.packages 無法讀取索引的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04