R实战 | 聚类分析

简介: R实战 | 聚类分析

数据准备


聚类分析之前,可以对数据进行预处理,如包括缺失值的处理和数据的标准化。以鸢尾花数据集(iris)为例。

# 数据预处理
mydata <- iris[,1:4]
mydata <- na.omit(mydata) # 删除缺失值
mydata <- scale(mydata) # 数据标准化

Partitioning(划分)


K-means 是我们最常用的基于欧式距离的聚类算法,其认为两个目标的距离越近,相似度越大。需要分析者先确定要将这组数据分成多少类,也即聚类的个数。根据所提取的簇数绘制出组内的平方和,可以帮助确定合适的簇数。


# 探索最佳聚类个数
# 计算不同个数聚类内部的距离平方和
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(mydata,centers=i)$withinss)
plot(1:15, wss, type="b", 
     xlab="Number of Clusters",
     ylab="Within groups sum of squares")

image.png

WSS


WSS下降趋于稳定的聚类数即为我们的最佳聚类。如图,聚类个数为4时满足要求。(3-5都差不多,并没有唯一聚类数)

# K-Means 聚类分析
fit <- kmeans(mydata, 4) # 聚类数为4
# 每个聚类的均值
aggregate(mydata,by=list(fit$cluster),FUN=mean)
# 添加聚类列
mydata_result <- data.frame(mydata, fit$cluster)

层次聚类


R语言提供了丰富的层次聚类函数,这里简单介绍一下用Ward方法进行的层次聚类分析。


层次的聚类方法(Hierarchical Clustering),从字面上理解,其是层次化的聚类,最终得出来的是树形结构。专业一点来说,层次聚类通过 计算不同类别数据点间的相似度 来创建一棵有层次的嵌套聚类树。


层次聚类的好处是不需要指定具体类别数目的,其得到的是一颗树,聚类完成之后,可在任意层次横切一刀,得到指定数目的簇。

image.png


聚类数示例


# Ward 层次聚类
d <- dist(mydata, method = "euclidean") #距离矩阵
fit <- hclust(d, method="ward")
plot(fit) # 聚类树

image.png


groups <- cutree(fit, k=3) # 将聚类树切成3个聚类
rect.hclust(fit, k=3, border="red")

image.png


pvclust包中的pvclust()函数提供了基于多尺度bootstrap重采样的分层聚类的p值。得到数据高度支持的聚类将具有较大的p值。

# Ward Hierarchical Clustering with Bootstrapped p values
library(pvclust)
fit <- pvclust(mydata, method.hclust="ward",
   method.dist="euclidean")
plot(fit) # dendogram with p values
# add rectangles around groups highly supported by the data
pvrect(fit, alpha=.95)

image.png

pvclust

基于模型聚类

基于模型的聚类方法利用极大似然估计法和贝叶斯准则在大量假定的模型中去选择最佳的聚类模型并确定最佳聚类个数。其中,对于参数化高斯混合模型,Mclust包中的Mclust()函数根据分层聚类初始化EM的BIC选择最优模型。

# Model Based Clustering
library(mclust)
fit <- Mclust(mydata)
plot(fit) # plot results
summary(fit) # display the best model

image.png

Mclust

> summary(fit) # display the best model
---------------------------------------------------- 
Gaussian finite mixture model fitted by EM algorithm 
---------------------------------------------------- 
Mclust VVV (ellipsoidal, varying volume, shape, and orientation) model with 2 components: 
 log-likelihood   n df       BIC       ICL
      -322.6936 150 29 -790.6956 -790.6969
Clustering table:
  1   2 
 50 100

从上面的结果来看,分为两个聚类效果更好。


聚类可视化

# K-Means Clustering with 5 clusters
fit <- kmeans(mydata, 3)
# vary parameters for most readable graph
library(cluster)
clusplot(mydata, fit$cluster, color=TRUE, shade=TRUE,
   labels=2, lines=0)

image.png

clusplot

# Centroid Plot against 1st 2 discriminant functions
install.packages('fpc')
library(fpc)
plotcluster(mydata, fit$cluster)

image.png

fpc

参考

Quick-R: Cluster Analysis (statmethods.net)(https://www.statmethods.net/advstats/cluster.html)


相关文章
|
机器学习/深度学习 人工智能 算法
【算法基础】分解质因数
【算法基础】分解质因数
661 0
|
缓存 NoSQL 数据库
高性能Web服务器架构设计
【8月更文第28天】在当今互联网时代,网站的响应速度直接影响用户体验和业务成功率。因此,构建一个高性能的Web服务器架构至关重要。本文将从硬件配置、软件架构以及网络设置三个方面探讨如何提高Web服务器的性能,并提供一些实际的代码示例。
725 0
|
10月前
|
数据采集 缓存 负载均衡
动态HTTP代理与静态HTTP代理的区别及HTTP代理的常见用途与类型
HTTP代理在网络通信中扮演重要角色,优化数据传输并提供隐私保护和访问控制。本文对比动态与静态HTTP代理,探讨其特点、优劣势及适用场景。静态代理地址固定,适合稳定环境;动态代理灵活切换服务器,增强隐私保护。此外,介绍HTTP代理的常见用途(如缓存加速、匿名浏览、绕过限制等)及类型(透明、普匿、匿名、高匿、正向、反向代理),帮助用户根据需求选择合适的代理方式。最后提醒用户遵守法律法规,确保安全使用。
355 1
|
数据安全/隐私保护
金盾金狮pbb爱问云点盾云加密视频录屏翻录提取教程
此软件专为录制加密网络课程视频设计,能轻松录制通常因加密而无法显示或录制的视频内容,并且录制过程隐蔽不被检测,输出文件为通用MP4格式。使用步骤简易:首先播放视频,然后打开软件并登录,即可开始录制。
2788 18
|
运维 前端开发 Oracle
再有人问你WebSocket为什么牛逼,就把这篇文章发给他!
再有人问你WebSocket为什么牛逼,就把这篇文章发给他!2008年6月诞生了一个影响计算机世界的通信协议,原先需要二十台计算机资源才能支撑的业务场景,现在只需要一台,这得帮"抠门"老板们省下多少钱,它就是大名鼎鼎的WebSocket协议。很快在下一年也就是2009年的12月,Google浏览器就宣布成为第一个支持WebSocket标准的浏览器。WebSocket的推动者和设计者就是下面的Michael Carter,他设计的WebSocket协议技术现在每天在全地球有超过的设备在使用。
567 1
再有人问你WebSocket为什么牛逼,就把这篇文章发给他!
|
Java 网络安全
解析connectionReset异常的原因与解决方案
解析connectionReset异常的原因与解决方案
|
SQL 分布式计算 资源调度
Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询
这篇教程将展示如何使用 Flink CDC + Iceberg + Doris 构建实时湖仓一体的联邦查询分析,Doris 1.1版本提供了Iceberg的支持,本文主要展示Doris和Iceberg怎么使用,同时本教程整个环境是都基于伪分布式环境搭建,大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。
3152 1
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
|
C++ 索引
C++ 获取数组大小、多维数组操作详解
本文介绍了如何获取数组的大小和使用`sizeof()`运算符。`sizeof()`返回数组所占字节数,而非元素个数。要获取元素个数,需除以单个元素的大小。此外,文章展示了如何使用`sizeof()`遍历数组,包括多维数组。多维数组是数组的数组,可用来表示网格。文中以战舰游戏为例说明了多维数组的应用。最后提到了微信公众号`Let us Coding`以获取更多内容。
491 0
|
机器学习/深度学习 运维 算法
从K-means到高斯混合模型:常用聚类算法的优缺点和使用范围?
从K-means到高斯混合模型:常用聚类算法的优缺点和使用范围?
2417 0