内容提要:
* 什么是聚类问题?
* 在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个欧洲国家,右边是对应的摄入的食物 「红肉、白肉、鸡蛋、牛奶、鱼、谷物、淀粉、坚果」。
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表示的是总的聚类变化数。
可以看出,在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')
第一个参数是聚类的数据集合,第二个参数是聚类的结果。
这个图中,每一圈代表的是一个聚类的类别,在一个组内的数据相似度相同,但是不在一个组的则相似度很低,这样我们就实现了聚类的效果。
声明:本文选自清华大学出版社的《深入浅出R语言数据分析》一书,略有修改,经出版社授权刊登于此。
好啦,以上内容出自这本《深入浅出R语言数据分析》,这本书中还包括「随机森林、支持向量机、神经网络、文本挖掘、社交网络分析、H20机器学习、R语言爬虫等等」,所有代码和示例都在书里有很好的呈现,非常适合新手学习,不同程度的读者可以按需阅读。
这本书的特点在于干货多,代码和实例丰富,非常适合边看书边敲代码,同时,也可以扫描书上的二维码,获得配套的所有程序和视频讲解,事半功倍~
3.福利赠送
为了给大家争取福利,特组织免费抽奖:送书「2本」,由清华大学出版社赞助。回复「入群」,即可免费参加哈~中奖的小伙伴填写地址后,我们将通知出版社寄出~注意:获奖的小伙伴一定要写清楚收获地址哈,不然小编还得在多个群里大海捞针找到你
好啦,这期的数据分析实战分享就到这里,如果你还希望认识更多志同道合的小伙伴,回复「入群」,加入我们的学习吧!~我们下期不见不散。
欢迎大家关注简博士的B站和公众号,在公众号私信“入群”,可以与小伙伴们一起讨论问题哦。
扫码关注我们
微信号|Dr_Janneil
B站|简博士


