聚类是一种无监督学习,它将相似的对象划分到同一个簇中。通过这样的划分,每个簇可能对应一些潜在的类别。例如,西瓜可以被划分为“深色瓜”、“浅色瓜”、“有籽瓜”和“无籽瓜”等,这些概念对于聚类算法而言事先是未知的。基于不同的学习策略,人们设计出很多类型的聚类算法,下面我们主要介绍K-Means聚类算法并使用Python实现它。
相似度计算
前面提到,聚类算法视图将相似的对象归为同一簇,不相似的对象归为不同簇。相似这一概念取决于所选择的相似度计量方法。常见的相似度计量方式有闵科夫斯基距离、欧氏距离和曼哈顿距离等。相关的概念及公式已经在KNN分类算法一文中阐述,这里就不再赘述。
K-Means算法
K-Means算法是一种原型聚类算法,原型聚类通常假设聚类结构能够通过一组原型刻画。这类算法首先对原型进行初始化,然后对原型进行迭代更新求解。采用不同的原型表示或者不同的求解方式,就会得到不同的聚类算法。
K-Means可以发现给定数据集中的k个簇,簇的个数k是用户指定的,每一个簇通过其质心(即簇中所有点的中心)来描述。该算法的工作流程是这样的:首先随机确定k个初始点作为质心。然后为数据集中的每个点找到距离它最近的质心,并将其分配到该质心对应的簇中。这一步完成后,每个簇的质心更新为该簇所有点的平均值。重复上述过程直到质心基本不再变动,我们就可以得到最终代表每个簇的质心以及每个点最终被归类的簇。整个过程的伪代码如下:
输入:样本集 D={
x1,x2,…,xm}; D = { x 1 , x 2 , … , x m } ;
聚类簇数 k k
过程:
1:从
中随机选择 k k 个样本作为初始均值向量
2:repeat
3: 令