ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包:
- K-均值聚类(K-means) stats::kmeans()、fpc::kmeansruns()
- K-中心点聚类(K-Medoids) cluster::pam() 、fpc::pamk()
- 层次聚类 stats::hclust()、BIRCH、CURE
- 密度聚类 fpc::DBSCAN(),OPTICS
- 网格聚类 optpart::clique
- 模型聚类 EM算法(期望最大化算法) mclust::Mclust() 、RWeka::Cobweb()
- 模糊聚类 FCM(Fuzzy C-Means)算法 cluster::fanny() 、e1071::cmeans()
K均值聚类
- stats::kmeans()
- fpc::kmeansruns()
stats::kmeans()
Usage:kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c("Hartigan-Wong", "Lloyd", "Forgy", "MacQueen"), trace=FALSE)
- x:聚类对象
- centers: 是聚类个数或者是聚类中心
- iter.max:是允许的最大迭代次数,默认为10
- nstart:是初始被随机选择的聚类中心
示例代码
##数据集进行备份
newiris <- iris
newiris$Species <- NULL
library(stats)
kc <- kmeans(x=newiris, centers = 3)
##查看具体分类情况
fitted(kc)
##在三个聚类中分别统计各种花出现的次数
table(iris$Species, kc$cluster)
查看运行结果,产生了3个聚类,如下解释:
> kc
K-means clustering with 3 clusters of sizes 62, 50, 38 #K-means算法产生了3个聚类,大小分别为38,50,62. Cluster means: #每个聚类中各个列值生成的最终平均值
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.901613 2.748387 4.393548 1.433871
2 5.006000 3.428000 1.462000 0.246000
3 6.850000 3.073684 5.742105 2.071053 Clustering vector: #每行记录所属的聚类(2代表属于第二个聚类,1代表属于第一个聚类,3代表属于第三个聚类) [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[71] 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 1 3 3 3 3 3 3 1 1 3 3 3 3 1 3 1 3 1 3 3 1 1 3 3 3 3 3 1 3 3 3 3 1 3
[141] 3 3 1 3 3 3 1 3 3 1 Within cluster sum of squares by cluster: #每个聚类内部的距离平方和,说明第一类样本点差异最大,第二类差异最小
[1] 39.82097 15.15100 23.87947
(between_SS / total_SS = 88.4 %)
#组间的距离平方和占了整体距离平方和的的88.4%,这个值越大表明组内差距越小,组间差距越大,即聚类效果越好该值可用于与类别数取不同值时的聚类结果进行比较。 Available components: [1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss" "size" "iter" "ifault"
#"cluster"是一个整数向量,用于表示记录所属的聚类
#"centers"是一个矩阵,表示每聚类中各个变量的中心点
#"totss"表示所生成聚类的总体距离平方和
#"withinss"表示各个聚类组内的距离平方和
#"tot.withinss"表示聚类组内的距离平方和总量
#"betweenss"表示聚类组间的聚类平方和总量
#"size"表示每个聚类组中成员的数量
创建一个连续表,在三个聚类中分别统计各种花出现的次数
> ##在三个聚类中分别统计各种花出现的次数
> table(iris$Species, kc$cluster) 1 2 3
setosa 0 50 0
versicolor 48 0 2
virginica 14 0 36
根据最后的聚类结果画出散点图,数据为结果集中的列"Sepal.Length"和"Sepal.Width",颜色为用1,2,3表示的缺省颜色
> plot(newiris[c("Sepal.Length", "Sepal.Width")], col = kc$cluster)
在图上标出每个聚类的中心点
> points(kc$centers[,c("Sepal.Length", "Sepal.Width")], col = 1:3, pch = 8, cex=2)
生成图例 如下:

小结:
在这个示例中, 首先将数据集中变量品种全部置为空, 然后重新指定3个聚类,比较一下kmeans算法生成的结果和原有的结果。
在kmean算法中针对变量 Sepal.Length Sepal.Width Petal.Length Petal.Width生成三组随机值作为中心点,然后计算每个样本中的4个变量到随机值的距离,根据最新的随机数值总合算出平均值重新计算中心点。然后不断的重复此步骤, 直到中心点的值不再变化。最后再将样本值和最终生成的中心值作比较,距离最近的归属于这个中心值所代表的聚类。最后使用plot函数画图的时候, 可以发现kmeans算法最后生成的分类并不是特别理想,各个聚类之间的距离并不是很大。需要多运行几次。
fpc::kmeansruns()
fpc包kmeansruns函数,相比于kmeans函数更加稳定,而且还可以估计聚为几类
Usage: kmeansruns(data,krange=2:10,criterion="ch",iter.max=100,runs=100,scaledata=FALSE,alpha=0.001, critout=FALSE,plot=FALSE,...);
- krange: 聚类个数范围
- critout: logical. If TRUE, the criterion value is printed out for every number of clusters
- iter.max:是允许的最大迭代次数,默认为100
需要安装包
install.packages("lme4")
install.packages("fpc")
示例代码
> newiris <- iris
> newiris$Species <- NULL
> library(fpc)
>
> kc1 <- kmeansruns(data = newiris,krange = 1:5,critout = TRUE)
2 clusters 513.9245
3 clusters 561.6278
4 clusters 530.7658
5 clusters 495.5415
> ##kc1
> ##fitted(kc1)
> table(iris$Species, kc1$cluster) 1 2 3
setosa 0 0 50
versicolor 2 48 0
virginica 36 14 0
>
待验证:
fpc::cluster.stats()
小结:
指定聚类个数范围为:1:5, 但估计聚类结果为3,与kmeans方法相比,不需初始确定聚类个数
参考资料:
- http://www.tuicool.com/articles/eMRvE3
- https://rdrr.io/cran/fpc/man/kmeansruns.html
- http://www.statmethods.net/advstats/cluster.html
ML: 聚类算法-K均值聚类的更多相关文章
- 聚类之K均值聚类和EM算法
这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...
- 聚类算法:K均值、凝聚层次聚类和DBSCAN
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
- 常见聚类算法——K均值、凝聚层次聚类和DBSCAN比较
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
- 聚类和EM算法——K均值聚类
python大战机器学习——聚类和EM算法 注:本文中涉及到的公式一律省略(公式不好敲出来),若想了解公式的具体实现,请参考原著. 1.基本概念 (1)聚类的思想: 将数据集划分为若干个不想交的子 ...
- 【机器学习】聚类算法——K均值算法(k-means)
一.聚类 1.基于划分的聚类:k-means.k-medoids(每个类别找一个样本来代表).Clarans 2.基于层次的聚类:(1)自底向上的凝聚方法,比如Agnes (2)自上而下的分裂方法,比 ...
- 100天搞定机器学习|day44 k均值聚类数学推导与python实现
[如何正确使用「K均值聚类」? 1.k均值聚类模型 给定样本,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类.用C表示 ...
- 【转】算法杂货铺——k均值聚类(K-means)
k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...
- (ZT)算法杂货铺——k均值聚类(K-means)
https://www.cnblogs.com/leoo2sk/category/273456.html 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先 ...
- 机器学习理论与实战(十)K均值聚类和二分K均值聚类
接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...
随机推荐
- 【Python】多进程1
1. 进程定义: (1) 进程是一个实体.每个进程都有他自己的地址空间,一般包括文本区域.数据区域和堆栈.进程是线程的容器. (2) 进程是一个“执行中的程序” 2. 进程的特征: (1) ...
- 路径问题 :<c:url >的作用
最近的项目一直报这样的错 可是本地启动 又没问题,xshell查看日志 没有错误日志,找了好久都没想到错误原因.一位大佬几分钟就找到原因了有点扎心. 首先说一下解决问题的思路.首先报错是4开头,说明是 ...
- vue 之 key
key 的特殊属性主要用在 Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes.如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法.使用k ...
- 大数据-07-Spark之流数据
摘自 http://dblab.xmu.edu.cn/blog/1084-2/ 简介 DStream是Spark Streaming的编程模型,DStream的操作包括输入.转换和输出. Spark ...
- 学习Java JDBC,看这篇就够了
JDBC (Java DB Connection)---Java数据库连接 JDBC是一种可用于运行SQL语句的JAVA API(ApplicationProgramming Interface应用程 ...
- Windows编程___创建窗口
创建Windows窗口不难,可以简要的概括为: 1,# 注册一个窗口类 填充WNDCLASS结构 书写窗口消息处理函数WinProc 2,# 创建一个窗口 填写基本的窗口信息 3,# 显示窗口 4,# ...
- Unity 3D中ToLua-UGUI使用说明、导入Unity流程、制作登陆界面
ToLua制作登录界面 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 请支持大神开发者:骏擎CP,蒙哥等奔 ...
- CSS使用方法
CSS行内样式: 在开始标签内添加style样式属性 如:<p style="color:red;">内容</p> CSS内部样式: 内部样式(嵌入样式), ...
- 异步测试celery
django异步请求: Django从一个http请求发起,到获得响应返回html页面的流程大致如下:http请求发起 -- http handling(request解析) -- url mappi ...
- djang 过滤器和装饰器
Django自定义过滤器 Django 自定义过滤器, 在项目目录中建立templatetags目录. 建立my_filter.py 文件, 导入模板模块 :from django import te ...