r语言kmodes_聚类分析——k-means算法及R语言实现
我們知道『物以類聚,人以群分』,這里并不是分類問題,而是聚類問題。
兩者主要區別在于,分類是將一組數據根據不同的類區分,已經知道有哪些類,也就是數據已經有了類的標簽。而聚類是一種事先不知道有多少類,通過算法學習,分出來了一些類別。
分類跟聚類也分別是有監督學習和無監督學習的范疇。
k-means算法
k-means是聚類算法中最簡單的,也是最常用的一種方法。
這里的
指的是初始規定要將數據集分成的類別,means是各類別數據的均值作為中心點。
算法步驟:
1.初始設置要分成的類別
,及隨機選取數據集中
個點作為初始點
2.根據相似性度量函數將其他點與初始點做比較,離哪個值近就分到哪一個類
3.將分出來的
類求取平均值,作為新的中心點
4.重復步驟,直到中心點不變或者變化不大(即收斂)或者達到規定的迭代次數則停止
相似性度量有多種函數,一般使用歐式距離。相似性度量函數
補充:為什么會使用均值作為中心點的選擇呢?
這主要是因為目標函數的設置決定的。我們使用誤差平方和作為聚類的目標函數,即
。
這里的
表示
個類,
表示第
個中心,
,
是歐幾里得距離。
對第
個中心
求解,最小化上述公式。對上述公式求導并令導數等于0,得到如下公式:
可以看到,每個簇中能夠讓目標函數達到最小的中心點就是這個簇的均值。
舉例說明
下面以一個具體例子來說明k-means算法步驟。數據集如下。
因為是二維的,可以畫下散點圖看下。
直觀來看,這個數據集是有兩類的,也就是兩個簇,一個是在右上角,一個是在左下角。可以使用算法看下是否符合預判。
Step1:
那我們可以設置
為2,初始中心值就選
。
Step2:
下面就是計算剩下的點到中心點的距離,使用歐氏距離。
比較之后,發現剩下的點到
距離更近,那現在有了兩類:
Step3:
然后重新選擇中心點,第一類只有一個值,則仍然為
。第二類按照5個點的均值作為中心點
: ((1+3+8+9+10)/5, (2+1+8+10+7)/5) = (6.2,5.6)。重新計算距離。
現在分成的兩類為
Step4:
Step2和Step3中心點相差較大,重新選擇中心點。
這次就是兩個類中數據的均值作為新的中心點了。分別為
。
現在仍然是兩類
繼續下去,中心點不變,也就是達到收斂了。分成的兩類就是上面兩組,與散點圖觀察到的一致。
R語言實現
使用R語言自帶的函數及可視化包。
數據及包的準備
# 載入數據
data("USArrests")
# 數據標準化
data
head(data)
# 可視化包
library(factoextra)
確定最佳聚類數,選擇坡度不明顯的點作為聚類數。
# 確定聚類數
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個類別。下面進行聚類。
#利用k-mean是進行聚類
km
# 查看結果
print(km)
查看結果并分析數據: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"
第一行結果是4類,每個類別的數據個數。
下面是聚類的中心點。
然后是每個值所屬哪個類別。
Within cluster sum of squares by cluster:是組間距離平方和。
聚類的目的是組內距離小,組間距離大。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不足
①需要確定分類數
,一般根據經驗或者已經有預判,其次是根據上面的方法確定分類數量。
②初始值的選取會影響最終聚類效果,并且目標函數
可能會達到局部最優解。這個有相應的改進方法,包括k-means++和二分k-means。
③對于類似下面圓形的數據集,聚類效果很差,主要是算法原因。所以還有其他的聚類算法,比如基于密度的方法等。
不過k-means實現簡單,易于理解,應用很廣泛。
總結
以上是生活随笔為你收集整理的r语言kmodes_聚类分析——k-means算法及R语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贴标机多少钱啊?
- 下一篇: java取非_java运算符 与()、非