r语言kmodes_聚类分析——k-means算法及R语言实现
我們知道『物以類聚,人以群分』,這里并不是分類問題,而是聚類問題。
兩者主要區(qū)別在于,分類是將一組數(shù)據(jù)根據(jù)不同的類區(qū)分,已經(jīng)知道有哪些類,也就是數(shù)據(jù)已經(jīng)有了類的標(biāo)簽。而聚類是一種事先不知道有多少類,通過算法學(xué)習(xí),分出來了一些類別。
分類跟聚類也分別是有監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)的范疇。
k-means算法
k-means是聚類算法中最簡(jiǎn)單的,也是最常用的一種方法。
這里的
指的是初始規(guī)定要將數(shù)據(jù)集分成的類別,means是各類別數(shù)據(jù)的均值作為中心點(diǎn)。
算法步驟:
1.初始設(shè)置要分成的類別
,及隨機(jī)選取數(shù)據(jù)集中
個(gè)點(diǎn)作為初始點(diǎn)
2.根據(jù)相似性度量函數(shù)將其他點(diǎn)與初始點(diǎn)做比較,離哪個(gè)值近就分到哪一個(gè)類
3.將分出來的
類求取平均值,作為新的中心點(diǎn)
4.重復(fù)步驟,直到中心點(diǎn)不變或者變化不大(即收斂)或者達(dá)到規(guī)定的迭代次數(shù)則停止
相似性度量有多種函數(shù),一般使用歐式距離。相似性度量函數(shù)
補(bǔ)充:為什么會(huì)使用均值作為中心點(diǎn)的選擇呢?
這主要是因?yàn)槟繕?biāo)函數(shù)的設(shè)置決定的。我們使用誤差平方和作為聚類的目標(biāo)函數(shù),即
。
這里的
表示
個(gè)類,
表示第
個(gè)中心,
,
是歐幾里得距離。
對(duì)第
個(gè)中心
求解,最小化上述公式。對(duì)上述公式求導(dǎo)并令導(dǎo)數(shù)等于0,得到如下公式:
可以看到,每個(gè)簇中能夠讓目標(biāo)函數(shù)達(dá)到最小的中心點(diǎn)就是這個(gè)簇的均值。
舉例說明
下面以一個(gè)具體例子來說明k-means算法步驟。數(shù)據(jù)集如下。
因?yàn)槭嵌S的,可以畫下散點(diǎn)圖看下。
直觀來看,這個(gè)數(shù)據(jù)集是有兩類的,也就是兩個(gè)簇,一個(gè)是在右上角,一個(gè)是在左下角。可以使用算法看下是否符合預(yù)判。
Step1:
那我們可以設(shè)置
為2,初始中心值就選
。
Step2:
下面就是計(jì)算剩下的點(diǎn)到中心點(diǎn)的距離,使用歐氏距離。
比較之后,發(fā)現(xiàn)剩下的點(diǎn)到
距離更近,那現(xiàn)在有了兩類:
Step3:
然后重新選擇中心點(diǎn),第一類只有一個(gè)值,則仍然為
。第二類按照5個(gè)點(diǎn)的均值作為中心點(diǎn)
: ((1+3+8+9+10)/5, (2+1+8+10+7)/5) = (6.2,5.6)。重新計(jì)算距離。
現(xiàn)在分成的兩類為
Step4:
Step2和Step3中心點(diǎn)相差較大,重新選擇中心點(diǎn)。
這次就是兩個(gè)類中數(shù)據(jù)的均值作為新的中心點(diǎn)了。分別為
。
現(xiàn)在仍然是兩類
繼續(xù)下去,中心點(diǎn)不變,也就是達(dá)到收斂了。分成的兩類就是上面兩組,與散點(diǎn)圖觀察到的一致。
R語言實(shí)現(xiàn)
使用R語言自帶的函數(shù)及可視化包。
數(shù)據(jù)及包的準(zhǔn)備
# 載入數(shù)據(jù)
data("USArrests")
# 數(shù)據(jù)標(biāo)準(zhǔn)化
data
head(data)
# 可視化包
library(factoextra)
確定最佳聚類數(shù),選擇坡度不明顯的點(diǎn)作為聚類數(shù)。
# 確定聚類數(shù)
fviz_nbclust(data, kmeans, method = "wss") + geom_vline(xintercept = 4, linetype = 2)
# 另一種方法
wss
for (i in 2:15)
wss[i]
plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="Within groups sum of squares")
可以選擇4個(gè)類別。下面進(jìn)行聚類。
#利用k-mean是進(jìn)行聚類
km
# 查看結(jié)果
print(km)
查看結(jié)果并分析數(shù)據(jù):print(km)
K-means clustering with 4 clusters of sizes 13, 16, 8, 13
Cluster means:
Murder Assault UrbanPop Rape
1 0.6950701 1.0394414 0.7226370 1.27693964
2 -0.4894375 -0.3826001 0.5758298 -0.26165379
3 1.4118898 0.8743346 -0.8145211 0.01927104
4 -0.9615407 -1.1066010 -0.9301069 -0.96676331
Clustering vector:
Alabama Alaska Arizona Arkansas
3 1 1 3
California Colorado Connecticut Delaware
1 1 2 2
Florida Georgia Hawaii Idaho
1 3 2 4
Illinois Indiana Iowa Kansas
1 2 4 2
Kentucky Louisiana Maine Maryland
4 3 4 1
Massachusetts Michigan Minnesota Mississippi
2 1 4 3
Missouri Montana Nebraska Nevada
1 4 4 1
New Hampshire New Jersey New Mexico New York
4 2 1 1
North Carolina North Dakota Ohio Oklahoma
3 4 2 2
Oregon Pennsylvania Rhode Island South Carolina
2 2 2 3
South Dakota Tennessee Texas Utah
4 3 1 2
Vermont Virginia Washington West Virginia
4 2 2 4
Wisconsin Wyoming
4 2
Within cluster sum of squares by cluster:
[1] 19.922437 16.212213 8.316061 11.952463
(between_SS / total_SS = 71.2 %)
Available components:
[1] "cluster" "centers" "totss" "withinss"
[5] "tot.withinss" "betweenss" "size" "iter"
[9] "ifault"
第一行結(jié)果是4類,每個(gè)類別的數(shù)據(jù)個(gè)數(shù)。
下面是聚類的中心點(diǎn)。
然后是每個(gè)值所屬哪個(gè)類別。
Within cluster sum of squares by cluster:是組間距離平方和。
聚類的目的是組內(nèi)距離小,組間距離大。between_SS / total_SS就是組間距離占總距離的占比,越接近1越好。
聚類可視化
fviz_cluster(km, data = data,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
star.plot = TRUE,
repel = TRUE,
ggtheme = theme_minimal()
)
k-means不足
①需要確定分類數(shù)
,一般根據(jù)經(jīng)驗(yàn)或者已經(jīng)有預(yù)判,其次是根據(jù)上面的方法確定分類數(shù)量。
②初始值的選取會(huì)影響最終聚類效果,并且目標(biāo)函數(shù)
可能會(huì)達(dá)到局部最優(yōu)解。這個(gè)有相應(yīng)的改進(jìn)方法,包括k-means++和二分k-means。
③對(duì)于類似下面圓形的數(shù)據(jù)集,聚類效果很差,主要是算法原因。所以還有其他的聚類算法,比如基于密度的方法等。
不過k-means實(shí)現(xiàn)簡(jiǎn)單,易于理解,應(yīng)用很廣泛。
總結(jié)
以上是生活随笔為你收集整理的r语言kmodes_聚类分析——k-means算法及R语言实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贴标机多少钱啊?
- 下一篇: 楚乔传羽姑娘是什么人身份揭秘 仲羽结局被