大数跨境
0
0

如何用R语言实现Kmeans聚类-数据探索实战分享

如何用R语言实现Kmeans聚类-数据探索实战分享 简博士数据分析吧
2022-09-24
0
导读:文末参与免费抽奖送书~



内容提要:

 * 什么是聚类问题?

 * 在R中如何实现Kmeans聚类模型?

 * 免费送书福利赠送

点击蓝字 |关注我们

欢迎回来。这一期我们不讲烧脑的数学原理,继续实战练习。如何用R语言实现「Kmeans聚类」

壹 什么是聚类问题?

当我们在进行数据分析时,通常第一步就要从原始数据中进行「多维缩放」,再对那些高维度的数据进行可视化,如果观察到的数据中存在数据聚集的情况,则「需要进一步对数据聚类」

1.聚类的概念

说到聚类,基本思想就是「物以类聚」,就是要在一大堆数据中找到一类的,关键点就在于「如何衡量数据间的相似性」

多数情况无法判断数据中是否存在聚集的情况,则需要先进行主观的判断。比如:将数据聚类为多少类别等。

2.Kmeans聚类原理

Kmeans又称为K均值聚类,是一种无监督的机器学习聚类算法,目的是「将观察分组到不同的聚类中」

作为使用最广泛的聚类算法,它的原理也非常易懂。

  • 1.选择k个对象作为初始化的中心点。
  • 2.遍历所有数据集,计算每个点与中心点的距离,将它分配给距离中心最近的组。
  • 3.重新计算每个组的平均值,作为新的聚类中心。
  • 4.重复以上步骤,直到结果不再变化。

贰 在R中实现聚类模型

1.数据导入

搞清楚了Kmeans的步骤,接着我们就来实战。首先,我们采用的是25个欧洲国家的蛋白质摄入百分比,原始数据来自这里:http://www.biz.uiowa.edu/faculty/jledolter/DataMining/protein.csv (公号内回复「蛋白质」获取收据)左边一列自然是25个欧洲国家,右边是对应的摄入的食物 「红肉、白肉、鸡蛋、牛奶、鱼、谷物、淀粉、坚果」

示例:25个欧洲国家的蛋白质摄入百分比

2.实例运算

接着,就开始一步步实现Kmeans啦。

2.1读取数据

使用readr包读取数据集,然后展示数据集中的前3条数据。

library(readr)
food <- read_csv("protein.csv")
head(food,3)

结果是:

  Country RedMeat WhiteMeat  Eggs  Milk  Fish Cereals Starch  Nuts `Fr&Veg`
  <chr>     <dbl>     <dbl> <dbl> <dbl> <dbl>   <dbl>  <dbl> <dbl>    <dbl>
1 Albania    10.1       1.4   0.5   8.9   0.2    42.3    0.6   5.5      1.7
2 Austria     8.9      14     4.3  19.9   2.1    28      3.6   1.3      4.3
3 Belgium    13.5       9.3   4.1  17.5   4.5    26.6    5.7   2.1      4  

2.2 判断聚类数

接着,我们就要确定聚多少个类了,前面说过这是一个比较主观的数,那么一般使用的是「Elbow」方法,俗称「手肘法」来判断最佳分类数。

Elbow方法的核心思想是:定义不同的聚类数据,选取使其总体变化最小化的聚类数。

kmax<-10
Elbow<-sapply(1:kmax, function(k) kmeans(food[,-1], centers = k, nstart = 10)$tot.withinss)
plot(1:kmax, Elbow, type = 'b', xlab = 'k', ylab = 'Total wss')

这里把最大聚类值设为10,x轴表示的是聚类中的聚类数目,y表示的是总的聚类变化数。

Elbow图

可以看出,在k=3的那里,代表了这个手肘图完全的拐点,那么3就是适当数量的簇数,因为我们说过这个值并不是越大越好,根据奥卡姆剃刀原理,刚刚好就行!

2.3 构建聚类模型

设置生成随机数的种子是123个,簇数有3个。

set.seed(123)
food_km<-kmeans(food[,-1], centers = 3, nstart = 50)
food_km

在K均值之前设置随机种子的原因是该算法随机选择起始中心点,因此如果没有设置种子,则会在另一次运行中产生不一样的结果。nstart是算法使用新的随机中心初始化的次数。

运行结果是:

K-means clustering with 3 clusters of sizes 12, 7, 6

Cluster means:
    RedMeat WhiteMeat     Eggs     Milk     Fish  Cereals   Starch     Nuts
1 12.091667  9.441667 3.708333 23.00000 4.991667 24.02500 4.616667 1.766667
2  7.614286  5.528571 1.800000 11.67143 1.742857 47.12857 2.914286 5.257143
3  7.883333  7.566667 2.716667 11.68333 5.833333 31.33333 5.183333 3.133333
    Fr&Veg
1 3.491667
2 3.642857
3 6.000000

Clustering vector:
 [1] 2 1 1 2 3 1 3 1 1 2 2 1 3 1 1 3 3 2 3 1 1 1 2 1 2

Within cluster sum of squares by cluster:
[1] 656.4517 561.8714 488.7267
 (between_SS / total_SS =  67.4 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"    
[5] "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"      

其中,第一行结果是3类,每个类别的数据个数分别是12,7,6个国家。下面是聚类的中心点,cluster vectors就代表了25个国家所属的类别序号。Within cluster sum of squares by cluster代表了组间距离平方和,聚类的目的是组内距离越小越好,组间距离越大越好。between_SS / total_SS =  67.4 %代表了组间距离和总距离的占比,这个值越接近于1越好。

2.4可视化

接着,我们画图来解读一下,用cluster包中的clusplot()函数:

library(cluster)
clusplot(food[,-1], food_pam$clustering, color = T, main = 'Cluster Plot')

第一个参数是聚类的数据集合,第二个参数是聚类的结果。

Kmeans聚类结果

这个图中,每一圈代表的是一个聚类的类别,在一个组内的数据相似度相同,但是不在一个组的则相似度很低,这样我们就实现了聚类的效果。

声明:本文选自清华大学出版社的《深入浅出R语言数据分析》一书,略有修改,经出版社授权刊登于此。

好啦,以上内容出自这本《深入浅出R语言数据分析》,这本书中还包括「随机森林、支持向量机、神经网络、文本挖掘、社交网络分析、H20机器学习、R语言爬虫等等」,所有代码和示例都在书里有很好的呈现,非常适合新手学习,不同程度的读者可以按需阅读。

这本书的特点在于干货多,代码和实例丰富,非常适合边看书边敲代码,同时,也可以扫描书上的二维码,获得配套的所有程序和视频讲解,事半功倍~

3.福利赠送

为了给大家争取福利,特组织免费抽奖:送书「2本」,由清华大学出版社赞助。回复「入群」,即可免费参加哈~中奖的小伙伴填写地址后,我们将通知出版社寄出~注意:获奖的小伙伴一定要写清楚收获地址哈,不然小编还得在多个群里大海捞针找到你

好啦,这期的数据分析实战分享就到这里,如果你还希望认识更多志同道合的小伙伴,回复「入群」,加入我们的学习吧!~我们下期不见不散。

 Python数据探索实战分享
《统计学习方法》前五章讲义汇总目录
《统计学习方法》第6章和第7章讲义汇总目录

欢迎大家关注简博士的B站和公众号,在公众号私信“入群”,可以与小伙伴们一起讨论问题哦。


扫码关注我们

微信号|Dr_Janneil

B站|简博士


【声明】内容源于网络
0
0
简博士数据分析吧
信息时代最不缺的是什么?数据!最缺的是什么?数据分析的思维!在这里,你将获取神秘的力量,推开数据之门!
内容 181
粉丝 0
简博士数据分析吧 信息时代最不缺的是什么?数据!最缺的是什么?数据分析的思维!在这里,你将获取神秘的力量,推开数据之门!
总阅读66
粉丝0
内容181