在前面我们介绍过了很多的监督学习算法,分类和回归。这篇文章主要介绍无监督算法,通过聚类分析来处理无类标数据。我们事先并不知道数据的正确结果(类标),通过聚类算法来发现和挖掘数据本身的结构信息,对数据进行分簇(分类)。聚类算法的目标是,簇内相似度高,簇间相似度低。有点像LDA降维算法,类内方差最小,类间方差最大。这篇文章主要包括:
1、K-Means算法
2、K-Means++
3、硬聚类和软聚类
4、聚类算法的性能评价指标
一、K-Means算法
在聚类算法中K-Means算法是一种最流行的、使用最广泛的一种聚类算法,因为它的易于实现且计算效率也高。聚类算法的应用领域也是非常广泛的,包括不同类型的文档分类、音乐、电影、基于用户购买行为的分类、基于用户兴趣爱好来构建推荐系统等。
K-Means算法的实现步骤,主要分为四个步骤:
1、从样本集合中随机抽取k个样本点作为初始簇的中心。
2、将每个样本点划分到距离它最近的中心点所代表的簇中。
3、用各个簇中所有样本点的中心点代表簇的中心点。
4、重复2和3,直到簇的中心点不变或达到设定的迭代次数或达到设定的容错范围。
常用的距离度量标准是欧几里得距离的平方:
其中x和y表示不同的两个样本,n表示样本的维度(特征的数量)。基于欧几里得距离,K-Means算法需要优化的问题就是,使得簇内误差平方和(within-cluster sum of squared errors,SSE)最小,也叫簇惯性(cluster intertia)。
下面利用sklearn来实现一个k-means算法的应用,使用sklearn的数据集,数据集中包含150个随机生成的点,样本点分为三个不同的簇
150个样本点的分布如上图所示。下面使用sklearn内置的KMeans算法来实现对上面样本点的聚类分析
二、K-Means++
K-Means算法需要随机选择初始化的中心点,如果中心点选择不合适,可能会导致簇的效果不好或产生收敛速度慢等问题。解决这个问题一个比较合适的方法就是,在数据集上多次运行K-Means算法,根据簇内误差平方和(SSE)来选择性能最好的模型。除此之外,还可以通过K-Means++算法,让初始的中心点彼此的距离尽可能的远,相比K-Means算法,它能够产生更好的模型。
K-Means++有下面几个步骤组成:
1、初始化一个空的集合M,用于存储选定的k个中心点
2、从输入的样本中随机选择第一个中心点μ,并将其加入到集合M中
3、对于集合M之外的任意样本点x,通过计算找到与其距离最小的样本d(x,M)
4、使用加权概率分布来随机来随机选择下一个中心点μ
5、重复步骤2和3,直到选定k个中心点
6、基于选定的中心点执行k-means算法
使用sklearn来实现K-Means++,只需要将init参数设置为"k-means++",默认设置是"k-means++"。下面利用k-means++算法来实现上面三个簇的聚类
通过上面图可以发现k-means++的聚类效果还不错,簇的中心点,基本位于球心。在实际情况中使用k-means++算法可能会遇到,由于样本的维度太高无法可视化,从而无法设定样本的簇数。k-means算法的簇不可重叠,也不可分层,并且假定每个簇至少会出现一个样本。
注意:由于k-means算法是基于欧式距离来计算的,所以k-means算法对于数据的范围比较敏感,所以在使用k-means算法之前,需要先对数据进行标准化,保证k-means算法不受特征量纲的影响。
三、硬聚类和软聚类
硬聚类(hard clustering)是指数据集中的样本只能划分到一个簇中,如k-means算法。软聚类(soft clustering)或模糊聚类(fuzzy clustering)可以将一个样本划分到多个不同的簇中,如C-means(FCM)算法。
FCM的计算步骤与k-means相似,只是FCM是使用样本属于不同簇的概率来代替k-means中的类标。样本属于不同簇的概率之和为1。
FCM的计算步骤如下:
1、指定k个中心点,并随机将每个样本点划分到某个簇中
2、计算各簇的中心μ
3、更新每个样本点所属簇的概率(隶属度)
4、重复步骤2和3直至,样本点所属簇的概率不变或是达到容错范围或最大迭代次数
隶属度的计算公式如下:
其中,ω表示的就是样本所属簇的概率,上式表示的簇的个数为3。样本属于簇j的概率。m大于1,一般取2,被称为模糊系数。
FCM算法的单次迭代计算成本要高于k-means算法,但FCM的收敛速度比较快。
四、聚类算法的性能指标
1、簇内误方差(SSE)
在对簇的划分中,我们就使用了SSE作为目标函数来划分簇。当KMeans算法训练完成后,我们可以通过使用inertia属性来获取簇内的误方差,不需要再次进行计算。
可以使用图形工具肘方法,根据簇的数量来可视化簇内误方差。通过图形可以直观的观察到k对于簇内误方差的影响。
通过上图可以发现,当簇数量为3的时候出现了肘型,这说明k取3是一个不错的选择。
2、轮廓图定量分析聚类质量
轮廓分析(silhouette analysis),使用图形工具来度量簇中样本的聚集程度,除k-means之外也适用于其他的聚类算法。通过三个步骤可以计算出当个样本的轮廓系数(silhouette coefficient):
1、将样本x与簇内的其他点之间的平均距离作为簇内的内聚度a
2、将样本x与最近簇中所有点之间的平均距离看作是与最近簇的分离度b
3、将簇的分离度与簇内聚度之差除以二者中比较大的数得到轮廓系数,计算公式如下
轮廓系数的取值在-1到1之间。当簇内聚度与分度离相等时,轮廓系数为0。当b>>a时,轮廓系数近似取到1,此时模型的性能最佳。
通过轮廓图,我们能够看出样本的簇数以及判断样本中是否包含异常值。为了评价聚类模型的性能,可以通过评价轮廓系数,也就是图中的红色虚线进行评价。
閱讀更多 機器學習之路 的文章