十大算法 —— K均值聚类
1、基本介绍
(1)概述:K-均值聚类是一种动态聚类的方法。其主要适用于分类问题。该算法给出一组对象(记录),聚类或分类的目标是把这些对象分割成组或集群,使得这些对象相比于组间,在组内更趋于相似。K-均值聚类是一种无监督学习的方法,因为不需要事先标记的数据。K-均值算法在实践中容易实施和运行,速度相对较快,算法内容也非常容易修改。
(2)优点
[1] 算法简单、迅速;
[2] 对于处理大数据集,该算法是相对可伸缩和高效的,因为它的复杂度大约是O (nkt)。其中n是所有对象的数目,k是分类的数目,t是迭代的次数,该算法经常以局部最优结束;
[3] 当类是密集、球状或者团状,且类与类之间区别明显时,该算法聚类效果很好。
(3)缺点
[1] 该算法只有在类的平均值被定义的情况下才能使用,不适用于某些分类属性的数据;
[2] 对初值比较敏感,对于不同的初始值可能会导致不同的聚类结果;
[3] 不适合于发现非凸面形状的类,或者大小差别很大的类;
[4] 对于“噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。
(4)该算法使用时的一些注意事项
[1] 算法中的K值需要认真选取;
[2] 要慎重选取初始的聚类中心,如果选择不当可能很容易陷入局部最优;
[3] 样本要随机选取,可以提高算法的收敛速度。
2、算法流程
(1)问题说明
![485ea3c875b7fc048ee85137444630dc.png](https://i-blog.csdnimg.cn/blog_migrate/3c3b5c805a0bca9d8bf861728819e3ca.jpeg)
(2)算法步骤(文字描述版)
![2f8c5e8539487bf4186e3c5c24fedc4c.png](https://i-blog.csdnimg.cn/blog_migrate/358751882b953c69978fa3a70a3bc431.jpeg)
(3)算法步骤(数学描述版)
![7f82aa6ab03cbcd7620d2bb413bae425.png](https://i-blog.csdnimg.cn/blog_migrate/b84d19218011ef750c3ee828c2fad6b8.jpeg)
3、详细例子
(1)例子一(靠嘴模拟)
![9e73bf19e57e9818789528b3335e9763.png](https://i-blog.csdnimg.cn/blog_migrate/5dd7ccd5fd3bb78324b2d85409ee0f1e.jpeg)
(2)例子二(R语言实操)
[1] 代码
library(class) # 加载class包
k1<-kmeans(as.matrix(iris[,1:4]),center=3) # 使用class包对iris数据集进行聚类,用于iris一共3类,所以类的个数center=3
k1 # 查看聚类的效果,between_SS / total_SS这一项>80%,表示聚类效果不错
table(iris[which(k1$cluster==1),5]) # 查看聚类分在第一类的实际情况
table(iris[which(k1$cluster==2),5]) # 查看聚类分在第二类的实际情况
table(iris[which(k1$cluster==3),5]) # 查看聚类分在第三类的实际情况
[2] 结果
![6c5d1b14152aa88874fee1a3ed3b9bef.png](https://i-blog.csdnimg.cn/blog_migrate/8202bca31e54ab72cb9befb29716aeab.jpeg)
![45eccf2dad43de3fd38d046418b487d4.png](https://i-blog.csdnimg.cn/blog_migrate/e0603fa7fcbf60e252a5242621fb1eff.jpeg)
从结果来看,还是有一定的分类错误,比如分在第一类和分在第二类的就有不同的实际类别情况。这可能是由于初始的类别中心选择不当,或者算法流程本身的问题所导致的,存在一定的误差~