K均值聚类
2022-03-15 本文已影响0人
学习生信的小兔子
算法会将数据集分为 K 个簇,每个簇使用簇内所有样本均值来表示,将该均值称为“质心”
距离计算方式是 欧式距离
a.从样本中选择 K 个点作为初始质心(完全随机)
b.计算每个样本到各个质心的距离,将样本划分到距离最近的质心所对应的簇中
c.计算每个簇内所有样本的均值,并使用该均值更新簇的质心
d.重复步骤 b与c,直至每个聚类不发生变化
欧氏距离
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
可看出两种方式计算得到的结果一致
参考:https://blog.csdn.net/weixin_30184337/article/details/111965820
第一个行与第二行的距离为2.693503;第二行与第三行的距离为6.113250;第一行与第三行的距离为5.548077
R k均值
k均值聚类是一种比较常用的聚类方法,R语言里做k均值聚类比较常用的函数是kmeans(),需要输入3个参数,第一个是聚类用到的数据,第二个是你想将数据聚成几类k,第三个参数是nstart
默认的nstart是1,推荐使用较大的值,以获得一个稳定的结果。比如可以使用25或者50。
那如果想使用k均值聚类的话,就可以分成两种情况,第一种是知道我自己想聚成几类,比如鸢尾花的数据集,明确想聚为3类。这时候直接指定k 下面用鸢尾花数据集做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值设置为一定的范围,然后根据聚类结果里的一些参数来筛选最优的结果
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