使用mclust进行聚类分析

mclust(Model-based clustering) 能够基于高斯有限混合模型进行聚类,分类以及密度估计(density estimation)。对于具有各种协方差结构的高斯混合模型,它提供了根据EM算法的参数预测函数。它也提供了根据模型进行模拟的函数。还提供了一类函数,整合了基于模型的层次聚类,混合估计的EM算法,用于聚类、密度估计和判别分析中综合性策略的贝叶斯信息判别标准。最后还有一类函数能够对聚类,分类和密度估计结果中的拟合模型进行可视化展示。

简而言之,mclust在R语言上实现了基于高斯有限混合模型聚类分类密度估计分析,并且还有专门的可视化函数展示分析结果。

mclust功能相似的其他R包: 'Rmixmod', 'mixture', 'EMCluster', 'mixtools', 'bgmm', 'flexmix'

安装和加载

在已有的R语言的基础上,只需要运行如下代码即可

# 安装
install.packages("mclust")
# 加载
library(mclust)

聚类实战

以一个例子来介绍一下如何使用mclust进行聚类分析。我们得要先加载一个来自于R包'gclus'的数据集'wine',该数据集有178行,分别是不同区域的品种葡萄, 14列,其中后13列是化学分析的测量值。我们的目标是将其进行分类。

第一步: 加载数据集

install.packages("gclus")
data("wine", package = "gclus")
dim(wine)

第二步 : 使用Mclust做聚类分析. Mclust主要功能就是分析当前的提供的数据是由什么统计模型

# 第一列和聚类无关
X <- data.matrix(wine[,-1])
mod <- Mclust(X)

直接在交互行输入mod会得到如下信息

'Mclust' model object: (VVE,3) 

Available components: 
 [1] "call"           "data"           "modelName"     
 [4] "n"              "d"              "G"             
 [7] "BIC"            "bic"            "loglik"        
[10] "df"             "hypvol"         "parameters"    
[13] "z"              "classification" "uncertainty" 

这里需要对结果稍作解释,第一行告诉我们'Mclust'以VVE模型将数据分为3类。第3行开始,它告诉我们'Mclust'的输出结果中包含了如下内容,我们可以通过$来提取。举个例子,我们提取Mclust的聚类结果和已知结果进行比较

table(wine$Class, mod$classification)
# 如下是输出信息
     1  2  3
  1 59  0  0
  2  0 69  2
  3  0  0 48
# adjustedRandIndex:评估聚类效果
adjustedRandIndex(wine$Class, mod$classification)

从结果中,我们发现仅有2例没有正确聚类,说明Mclust的效果很好。但是随之而来的问题是,Mclust如何挑选模型以及它为什么认为聚成3类比较合适呢?我们可以根据什么信息进行模型选择呢?

模型选择

为了解答上面的问题,我们需要稍微了解点Mclust的原理。和其他基于模型的方法类似,Mclust假设观测数据是一个或多个混合高斯分布的抽样结果,Mclust就需要根据现有数据去推断最优可能的模型参数,以及是由 q几组分布抽样而成。mclust一共提供了14种模型(见下表),可以用?mclustModelNames可以查看mclust提供的所有模型。

模型总结

为了对模型有一个直观的理解,mclust提供了这些模型数据分为三组前提下在二维中的形状。

二维的模型形状

继续回到之前的问题,Mclust如何确定模型和确定分组数目。之前我们调用Mclust时,除了必须设置的输入参数,没有修改其他参数。其实Mclust可以设置的参数不少,和问题直接相关的是如下两个参数

  • G: 分组数,默认情况下是1:9
  • modelNames: 待拟合的模型,默认使用所有14种。

也就是,Mclust默认得到14种模型1到9组的分析结果,然后根据一定的标准选择最终的模型和分组数。

Mclust提供了两种方法用于评估不同模型在不同分组下的可能性

  • BIC( Bayesian Information Criterion ): 贝叶斯信息判别标准
  • ICL( integrated complete-data likelihood ): 综合完全数据可能性

Mclust默认用的就是BIC,因此我们可以用plot.Mclust绘制其中BIC变化曲线

plot.Mclust(mod, what = "BIC", 
     ylim = range(mod$BIC[,-(1:2)], na.rm = TRUE), 
     legendArgs = list(x = "bottomleft", cex =0.7))

BIC曲线

Mclucst会选择其中BIC最大的模型和分组作为最终的结果。

此外我们可以用MclustBICMclustICL分别进行计算

par(mfrow=c(1,2))
BIC <- mclustBIC(X)
ICL <- mclustICL(X)

从中选择最佳的模型分组和模型作为输入

mod2 <- Mclust(X, G = 3, modelNames = "VVE", x=BIC)

可视化展示

mclust为不同的输出都提供了对应的泛型函数用于可视化,你需要用plot就能得到结果。例如对之前的聚类结果在二维空间展示

drmod <- MclustDR(mod, lambda = 1)
plot(drmod)
# 会提供一些列选项让你选择, 展示不同的结果
# Dimension reduction for model-based clustering and classification plots: 

1: scatterplot
2: contour
3: classification
4: boundaries
5: density
6: evalues
# 以1为例

plot

mclust还有很多其他功能,例如密度估计,自举推断(Bootstrap inference),这些内容建议阅读"mclust 5: Clustering, Classification and Density Estimation Using Gaussian Finite Mixture Models "

推荐阅读

想要更好的学习这个R包的使用,还需要去学习如下概念

  • EM算法( expectation–maximization algorithm )
  • BIC
  • MLE(maximum likelihood estimator)

----

版权声明:本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。

扫码即刻交流

  • 17
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 项目背景 基于项目提供的汽车相关数据,通过聚类分析的方法实现汽车产品聚类,以构建汽车产品画像、分析产品定位、完成汽车竞品分析等要求。 2. 项目数据 项目提供的汽车数据包括26个字段共205条数据,数据文件为“car_price.csv” 26个字段可以划分为类别型变量和数值型变量两种,包括汽车的长/宽/高、汽车净重、燃油系统、燃油类型、驱动类型、峰值转速、里程数、汽车价格等。 3. 项目要求 通过聚类的方法构建汽车产品画像、分析不同类别汽车的产品定位,寻找Volkswagen大众汽车的竞品品牌。 4. 项目思路 第一步:数据字段理解 根据项目所提供的数据,对数据中26个字段进行理解。结合汽车行业的相关知识,26个字段可以大致归为两类:第一类是车辆自身属性(如燃油系统、燃油类型、汽缸数、峰值转速、汽车长宽高等);第二类是车辆的市场属性(如车辆名称、车辆价格、风险评估等级)。 26个字段主要分为数值型变量和类别型变量两类。 第二步:原始数据描述性统计及变量分布可视化 对原始数据进行描述性统计并对数据中的字段分布进行可视化(详情见主文档)。通过对原始数据的观察,数据不存在缺失值、不存在重复值,“CarName”字段存在部分车辆品牌名称错误的情况。 第三步:确定聚类方法,明确聚类要求 通过对原始数据的变量观察,该数据变量主要为数值型变量和类别型变量两类,且类别型变量数量较多,常用的K-means聚类只能分析数值型变量,无法考虑类别型变量所包含的信息。二阶段聚类法适用于包含数值型和类别型变量的混合数据,因此考虑使用二阶段聚类法分析数据。 二阶段聚类法的要求是:类别型变量符合多项式分布(即变量的值分属几个类别);数值型变量间要相互独立,且数值型变量近似服从正态分布。项目所给出的数据中,类别型变量符合多项式分布,因此仅需进一步观察并处理数值型变量。 第四步:特征工程 数据清洗与新变量生成。原始数据指给出了车辆的名称,没有给出车辆所属品牌,结合最终聚类分析的需要,根据“CarName”字段提取出车辆所属品牌信息,命名为“brand”。同时对品牌名称中的错误拼写进行清洗。 变量相关性分析与可视化。由于二阶段聚类要求数值型变量间相互独立,所以需要对数值型变量间的相关性进行查看与处理。相关性分析结果表示14个数值型变量之间存在高相关性情况,需要结合汽车知识背景与变量特征进行进一步处理。 高相关变量的处理——“highwaympg”和“citympg”呈高度正相关。其实不管是高速mpg还是城市mpg,其本质都是mpg指标,而且通过观察数据,二者之间的差异较小(极值、均值),因此考虑将二者合并为一个指标'mpg',计算方式为取二者均值:mpg=(highwaympg+citympg)/2; 高相关性变量的处理——“price”变量与其余变量产生高相关性的频数最多,可能是因为车辆自身属性和配置的变动会直接影响着车辆的市场价格。此外,与其他变量相比,price属性属于车辆的市场销售属性(而非车辆自身属性),在聚类中更适合作为类别型变量,对车辆的价位进行划分,因此,考虑将price变量转换为类别型变量,按照其价格分布划分为Low price(20000)三类; 高相关性变量的处理——对于其余数值型变量,变量数目较多且多个变量之间存在相关性,因此考虑使用因子分析对数值型变量进行降维,以减少数值型变量的数目并使变量间相互独立。 第五步:数值型变量因子分析结果(基于SPSS实现) 利用SPSS对数值型变量进行因子分析,KMO值>0.8,巴特利球形检验p值=0,说明参与因子分析的变量间存在相关性,可以进行因子分析。最终得到两个因子。 第一个因子包括:车长、车宽、车净重、引擎尺寸、车轴距、mpg、马力、车内径比。简单将该因子归纳为车辆截面与马力因子; 第二个因子包括:车高、峰值转速、车压缩比。简单将该因子归纳为车辆垂面与转速因子; 第六步:两阶段聚类及结果(基于SPSS实现) 对处理后的数据进行两阶段聚类,最终将205辆车聚为两类。 根据SPSS聚类结果,第一类中包含120条车辆数据,占总数据的58.5%;第二类中包含85条车辆数据,占总数据的41.5%。两类簇数据规模近似,没有过大或过小的类簇。 根据SPSS聚类结果,聚类质量属于“良好”范围,仍有进一步改进和优化的空间。 根据SPSS聚类结果,显著区分两类类簇的变量(重要性>0.6)按重要性大小排序依次是驱动类型、燃油系统、车辆截面与马力因子、价格范围。 汽车产品画像与产品定位 根据区分类簇的四个重要标签来对数据中的汽车产品进行产品画像与产品定位。 第一类画像:驱动类型多为fwd(前轮驱动),燃油系统多

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值