R语言学习笔记之聚类分析

Python06

R语言学习笔记之聚类分析,第1张

R语言学习笔记之聚类分析

使用k-means聚类所需的包:

factoextra

cluster #加载包

library(factoextra)

library(cluster)l

#数据准备

使用内置的R数据集USArrests

#load the dataset

data("USArrests")

#remove any missing value (i.e, NA values for not available)

#That might be present in the data

USArrests <- na.omit(USArrests)#view the first 6 rows of the data

head(USArrests, n=6)

在此数据集中,列是变量,行是观测值

在聚类之前我们可以先进行一些必要的数据检查即数据描述性统计,如平均值、标准差等

desc_stats <- data.frame( Min=apply(USArrests, 2, min),#minimum

Med=apply(USArrests, 2, median),#median

Mean=apply(USArrests, 2, mean),#mean

SD=apply(USArrests, 2, sd),#Standard deviation

Max=apply(USArrests, 2, max)#maximum

)

desc_stats <- round(desc_stats, 1)#保留小数点后一位head(desc_stats)

变量有很大的方差及均值时需进行标准化

df <- scale(USArrests)

#数据集群性评估

使用get_clust_tendency()计算Hopkins统计量

res <- get_clust_tendency(df, 40, graph = TRUE)

res$hopkins_stat

## [1] 0.3440875

#Visualize the dissimilarity matrix

res$plot

Hopkins统计量的值<0.5,表明数据是高度可聚合的。另外,从图中也可以看出数据可聚合。

#估计聚合簇数

由于k均值聚类需要指定要生成的聚类数量,因此我们将使用函数clusGap()来计算用于估计最优聚类数。函数fviz_gap_stat()用于可视化。

set.seed(123)

## Compute the gap statistic

gap_stat <- clusGap(df, FUN = kmeans, nstart = 25, K.max = 10, B = 500)

# Plot the result

fviz_gap_stat(gap_stat)

图中显示最佳为聚成四类(k=4)

#进行聚类

set.seed(123)

km.res <- kmeans(df, 4, nstart = 25)

head(km.res$cluster, 20)

# Visualize clusters using factoextra

fviz_cluster(km.res, USArrests)

#检查cluster silhouette图

Recall that the silhouette measures (SiSi) how similar an object ii is to the the other objects in its own cluster versus those in the neighbor cluster. SiSi values range from 1 to - 1:

A value of SiSi close to 1 indicates that the object is well clustered. In the other words, the object ii is similar to the other objects in its group.

A value of SiSi close to -1 indicates that the object is poorly clustered, and that assignment to some other cluster would probably improve the overall results.

sil <- silhouette(km.res$cluster, dist(df))

rownames(sil) <- rownames(USArrests)

head(sil[, 1:3])

#Visualize

fviz_silhouette(sil)

图中可以看出有负值,可以通过函数silhouette()确定是哪个观测值

neg_sil_index <- which(sil[, "sil_width"] <0)

sil[neg_sil_index, , drop = FALSE]

##          cluster    neighbor     sil_width

## Missouri    3          2        -0.07318144

#eclust():增强的聚类分析

与其他聚类分析包相比,eclust()有以下优点:

简化了聚类分析的工作流程

可以用于计算层次聚类和分区聚类

eclust()自动计算最佳聚类簇数。

自动提供Silhouette plot

可以结合ggplot2绘制优美的图形

#使用eclust()的K均值聚类

# Compute k-means

res.km <- eclust(df, "kmeans")

# Gap statistic plot

fviz_gap_stat(res.km$gap_stat)

# Silhouette plotfviz_silhouette(res.km)

##    cluster size ave.sil.width

## 1     1     13      0.31

## 2     2     29      0.38

## 3     3      8      0.39

#使用eclust()的层次聚类

# Enhanced hierarchical clustering

res.hc <- eclust(df, "hclust") # compute hclust

fviz_dend(res.hc, rect = TRUE) # dendrogam

#下面的R代码生成Silhouette plot和分层聚类散点图。

fviz_silhouette(res.hc) # silhouette plot

##   cluster size ave.sil.width

## 1    1     19      0.26

## 2    2     19      0.28

## 3    3     12      0.43

fviz_cluster(res.hc) # scatter plot

#Infos

This analysis has been performed using R software (R version 3.3.2)

所谓聚类分析,就是按照个体的特征将他们分类,并且在于让同一个类别内的个体之间具有较高的相似度,让不同类别之间具有较大的差异性。这样,研究人员就能根据不同类别的特征有针对性的进行分析,并制定出适用于不同类别的解决方案。

聚类分析主要应用在市场细、用户细分等领域。

如何将个体划分成不同的类别?

为了合理的进行聚类,需要采用适当的指标来衡量研究对象之间的联系紧密程度,常用的指标有“距离”和“相似系数”。假设将研究对象采用点表示,聚类分析时,将“距离”小的点或者“相关系数”较大的点归为一类,将“距离”大的点或“相关系数”小的点归为一类。

聚类分析的特点?

1)聚类结果是未知的。不同的聚类方法可能得到不同的分类结果,相同的聚类方法但是所分析的变量不同,也会得到不同的聚类结果。

2)对于聚类结果的合理性判断比较主观。只要类别内的相似性和类别间的差异性都能得到合理的解释和判断,就认识聚类结果是可行的。

常见应用场景?

零售研究中,刻画不同的用户或消费者生活形态以及特征;互联网中,通过用户浏览、消费行为来总结用户特征;金融研究中,根据用户金融行为和资产状况对用户进行分类;城市规划中,根据区域特征对城市分类......

聚类分析的步骤:

1)确定需要参加聚类分析的变量。即使用那些变量来进行分类。

2)对数据进行标准化处理。单位、数量级等

3)选择聚类方法和类别数目。即用什么聚类方法,分成几类。

4)分析聚类结果。

为什么要对数据进行标准化处理?

因为有事各个变量之间的变量值的数量级别差异较大,或者单位也不一样。例如一个是元,一个是万元,再或者数量级别差距太大都无法进行比较或者计算“距离”和“相似系数”等指标。只有通过标准化处理,消除变量间的量纲关系的影响,在统一标准下才能够进行比较或者计算“距离”和“相似系数”等指标。

聚类方法的分类

聚类方法主要有三种:

1)快速聚类:也称K均值聚类,他是按照一定的方法,选取一批聚类中心点,让个案向最近的聚类中心点聚集形成初始分类,然后按照最近距离原则调整不合理的分类,直到分类合理为止。

2)系统聚类:也称层次聚类,首先将参与聚类的个案(或变量)各视为一类,然后根据两个类别之间的距离或者相似性逐步合并,直到所有个案(或变量)合并为一个大类为止。

3)二阶聚类:也称两步聚类,这是随着人工智能的发展而发展起来的一种智能聚类方法。分成两个步骤:第一步骤是预聚类,就是根据定义的最大类别数对个案进行初步归类;第二步骤是正式聚类,就是对第一步骤得到的初步聚类进行在聚类并确定最终聚类结果,并且在这一步中,会根据一定的统计标准确定聚类的类别数。

聚类分析的主要步骤

聚类分析的主要步骤

1.数据预处理,2.为衡量数据点间的相似度定义一个距离函数,3.聚类或分组,4.评估输出。

数据预处理包括选择数量,类型和特征的标度,它依靠特征选择和特征抽取,特征选择选择重要的特征,特征抽取把输入的特征转化为一个新的显著特征,它们经常被用来获取一个合适的特征集来为避免“维数灾”进行聚类,数据预处理还包括将孤立点移出数据,孤立点是不依附于一般数据行为或模型的数据,因此孤立点经常会导致有偏差的聚类结果,因此为了得到正确的聚类,我们必须将它们剔除。

既然相类似性是定义一个类的基础,那么不同数据之间在同一个特征空间相似度的衡量对于聚类步骤是很重要的,由于特征类型和特征标度的多样性,距离度量必须谨慎,它经常依赖于应用,例如,通常通过定义在特征空间的距离度量来评估不同对象的相异性,很多距离度都应用在一些不同的领域,一个简单的距离度量,如Euclidean距离,经常被用作反映不同数据间的相异性,一些有关相似性的度量,例如PMC和SMC,能够被用来特征化不同数据的概念相似性,在图像聚类上,子图图像的误差更正能够被用来衡量两个图形的相似性。

将数据对象分到不同的类中是一个很重要的步骤,数据基于不同的方法被分到不同的类中,划分方法和层次方法是聚类分析的两个主要方法,划分方法一般从初始划分和最优化一个聚类标准开始。CrispClustering,它的每一个数据都属于单独的类;FuzzyClustering,它的每个数据可能在任何一个类中,CrispClustering和FuzzyClusterin是划分方法的两个主要技术,划分方法聚类是基于某个标准产生一个嵌套的划分系列,它可以度量不同类之间的相似性或一个类的可分离性用来合并和分裂类,其他的聚类方法还包括基于密度的聚类,基于模型的聚类,基于网格的聚类。

评估聚类结果的质量是另一个重要的阶段,聚类是一个无管理的程序,也没有客观的标准来评价聚类结果,它是通过一个类有效索引来评价,一般来说,几何性质,包括类间的分离和类内部的耦合,一般都用来评价聚类结果的质量,类有效索引在决定类的数目时经常扮演了一个重要角色,类有效索引的最佳值被期望从真实的类数目中获取,一个通常的决定类数目的方法是选择一个特定的类有效索引的最佳值,这个索引能否真实的得出类的数目是判断该索引是否有效的标准,很多已经存在的标准对于相互分离的类数据集合都能得出很好的结果,但是对于复杂的数据集,却通常行不通,例如,对于交叠类的集合。