算法會將數(shù)據(jù)集分為 K 個簇癣丧,每個簇使用簇內(nèi)所有樣本均值來表示闹丐,將該均值稱為“質(zhì)心”
距離計算方式是 歐式距離
a.從樣本中選擇 K 個點作為初始質(zhì)心(完全隨機)
b.計算每個樣本到各個質(zhì)心的距離,將樣本劃分到距離最近的質(zhì)心所對應(yīng)的簇中
c.計算每個簇內(nèi)所有樣本的均值奕锌,并使用該均值更新簇的質(zhì)心
d.重復(fù)步驟 b與c梢夯,直至每個聚類不發(fā)生變化
歐氏距離
R計算歐式距離
aa=matrix(
rnorm(15,0,1),nrow = 3
)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.9925072 -0.723066 -0.5739735 0.70758835 -0.7045965
[2,] 1.6756969 -1.236273 0.6179858 -0.36365730 -0.7172182
[3,] -0.4411632 -1.284716 1.1098481 0.05974994 0.8846505
dist(aa,method = "euclidean")
1 2
2 3.154550
3 2.529839 2.733245
或者使用philentropy包
library(philentropy)
distance(aa,method = "euclidean")
v1 v2 v3
v1 0.000000 3.154550 2.529839
v2 3.154550 0.000000 2.733245
v3 2.529839 2.733245 0.000000
可看出兩種方式計算得到的結(jié)果一致
參考:https://blog.csdn.net/weixin_30184337/article/details/111965820
第一個行與第二行的距離為2.693503千劈;第二行與第三行的距離為6.113250糙麦;第一行與第三行的距離為5.548077
R k均值
k均值聚類是一種比較常用的聚類方法辛孵,R語言里做k均值聚類比較常用的函數(shù)是kmeans()丛肮,需要輸入3個參數(shù)赡磅,第一個是聚類用到的數(shù)據(jù),第二個是你想將數(shù)據(jù)聚成幾類k宝与,第三個參數(shù)是nstart
默認的nstart是1焚廊,推薦使用較大的值,以獲得一個穩(wěn)定的結(jié)果习劫。比如可以使用25或者50咆瘟。
那如果想使用k均值聚類的話,就可以分成兩種情況诽里,第一種是知道我自己想聚成幾類袒餐,比如鳶尾花的數(shù)據(jù)集,明確想聚為3類。這時候直接指定k 下面用鳶尾花數(shù)據(jù)集做k均值聚類
df<-iris[,1:4]
iris.kmeans<-kmeans(df,centers=3,nstart = 25)
names(iris.kmeans)
[1] "cluster" "centers" "totss"
[4] "withinss" "tot.withinss" "betweenss"
[7] "size" "iter" "ifault"
iris.kmeans$cluster
#存儲的是每個樣本被歸為哪一類
iris.kmeans$size
[1] 62 50 38 #存儲的是每一個大類有多少個樣本
library(factoextra)
fviz_cluster(object=iris.kmeans,data=iris[,1:4],
ellipse.type = "euclid",star.plot=T,repel=T,
geom = ("point"),palette='jco',main="",
ggtheme=theme_minimal())+
theme(axis.title = element_blank())
第二種情況是我不知道想要聚成幾類灸眼,這個時候就可以將k值設(shè)置為一定的范圍卧檐,然后根據(jù)聚類結(jié)果里的一些參數(shù)來篩選最優(yōu)的結(jié)果
df<-USArrests
fviz_nbclust(df, kmeans, method = "wss")
從圖上看4到5變得平滑了,選擇4試一下
usa.kmeans<-kmeans(df,centers=4,nstart = 25)
fviz_cluster(object=usa.kmeans,df,
ellipse.type = "euclid",star.plot=T,repel=T,
geom = c("point","text"),palette='jco',main="",
ggtheme=theme_minimal())+
theme(axis.title = element_blank())
參考:https://mp.weixin.qq.com/s/Pf1a7OermNpY8OzKbfRhEQ