做图RR学习与可视化

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
上一篇下一篇

猜你喜欢

热点阅读