机器学习经典算法详解及Python实现

  既然聚类可以看做是一种无监督分类,那么其应用场景就是广泛的,包括用户群划分、文本分类、图像识别等等。当几乎没有有关数据的先验信息(如统计模型)可用,而用户又要求尽可能地对数据的可能性少进行假设等限制条件下,聚类方法都适合用来查看数据点中的内在关系以对它们的结构进行评估、决策。

  机器学习中常见的聚类算法包括 k-Means算法、期望最大化算法(Expectation Maximization,EM,参考“EM算法原理”)、谱聚类算法(参考机器学习算法复习-谱聚类)以及人工神经网络算法,本文介绍K-均值(K-means)聚类算法。

  (二)K-均值(K-means)聚类算法

  1. 认识K-均值聚类算法

  K-均值算法是最简单的一种聚类算法,属于分割式聚类算法,目的是使各个簇(共k个)中的数据点与所在簇质心的误差平方和SSE(Sum of Squared Error)达到最小,这也是评价K-means算法最后聚类效果的评价标准。

  k-means算法的基础是最小误差平方和准则。其代价函数是:

  

  式中,μc(i)表示第i个簇的质心,我们希望得到的聚类模型代价函数最小,直观的来说,各簇内的样本越相似,其与该簇质心的误差平方越小。计算所有簇的误差平方之和,即可验证分为k个簇时时的聚类是否是最优的。SSE值越小表示数据点越接近于它们的质心,聚类效果也越好。因为对误差取了平方,因此更加重视那些远离中心的点。

  一种肯定可以降低SSE值的方法是增加簇的个数,但这违背了聚类的目标,聚类的目标是在保持族数目不变的情况下提高簇的质量。

  k-均值(k-means)聚类算法之所以称之为k-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含子数据集样本特征的均值计算而成。k-均值是发现给定数据集的k个簇的算法,簇个数k由用户给定,每一个簇通过其质心( centroid) — 即簇中所有点的中心来描述。K-均值聚类算法需要数值型数据来进行相似性度量,也可以将标称型数据映射为二值型数据再用于度量相似性,其优点是容易实现,缺点是可能收敛到局部最小值,在大规模数据集上收敛较慢。

  假设训练样本数据集X为(m, n)维矩阵,m表示样本数、n表示每个样本点的特征数,那么k-均值聚类算法的结果就是得到一个kxn维矩阵,k表示用户指定的簇个数,每一行都是一个长度为n的行向量–第i个元素就是该簇中所有样本第j(j=0,1,…,n-1)个特征的均值。下图是K-均值聚类算法聚类的过程:

  

  2. 算法过程

  K-均值算法的工作流程是这样的。首先,随机确定k个初始点作为质心;然后将数据集中的每个点分配到一个簇中–就是为每个点找距其最近的质心,并将其分配给该质心所对应的簇;该步完成之后更新每个簇的质心(该簇所有数据样本特征的平均值);

  上述过程迭代多次直至所有数据点的簇归属不再改变或者达到了最大迭代次数Maxiteration。k-均值算法的性能会受到所选相似性度量方法的影响,常用的相似性度量方法就是计算欧氏距离。上述过程的伪代码表示如下:

  ***************************************************************

  创建k个点作为起始质心

  任意点的簇分配结果发生改变时(循环内设置、维护标志位changed,也可同时设定最大迭代次数max)

  对数据集中的每个数据点

  对每个质心

  计算质心与数据点之间的距离

  将数据点分配到距其最近的簇(若有点的簇发生改变则置标志位为changed = True)

  更新簇中心: 对每一个簇,计算簇中所有点的均值并将均值作为质心

  ***************************************************************

  上述循环的终止条件是每个点的簇分配结果没有发生改变或者达到了最大循环次数。

  初始化时k个质心的选择可以是随机的,但为了提高性能常用的方式是