k均值聚类(K-Means Clustering)算法由J.MacQueen(1967)和J.A.Hartigan还有M.A.Wong三人在1975左右提出的。简单的说,k-means聚类算法就是根据你的数据对象的属性特征将你的数据对象进行分类或者分组。再简单点儿说,k-mean聚类就是将你的数据分类用的。

K-均值是一个迭代算法,假设我们想要将数据聚类成 n 个组,其方法为:

  1.  首先选择 K 个随机的点,称为聚类中心( cluster centroids)
  2. 2. 对于数据集中的每一个数据,按照距离 K 个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类
  3.  计算每一个组的平均值, 将该组所关联的中心点移动到平均值的位置
  4.  重复步骤 2-4 直至中心点不再变化

下面是一个含有2个聚类中心点的例子,例子中的数据最终会被分成两组。

首先看看数据的坐标分布:


k均值聚类算法实现代码 k均值聚类算法例子_k均值聚类算法实现代码

在数据中随机放两个聚类中心点,聚类中心点的位置可以任意选取。

聚类最后的分组数就是中心点的个数。你的分组数决定了聚类中心点的个数。

下图红色叉号和绿色叉号是两个聚类中心点。

k均值聚类算法实现代码 k均值聚类算法例子_数据_02

有了聚类中心点,接下来就该确定数据的“归属”了。聚类红色中心点的数据归属一类,同样,距离绿色的归属另一类。

k均值聚类算法实现代码 k均值聚类算法例子_聚类_03

经过简单的一步,数据就粗略地分为了两类,很显然,分类很糟糕。为了得到更好的结果,需要把聚类中心点”移动“一下。

以红色中心点为例,中心点应该移动到所有红色数据的“平均位置”。在这个例子中,用坐标来表示并计算。那么“平均“位置就是:横坐标x=所有红色数据的x坐标的平均值。纵坐标y=所有红色数据的y坐标平均值。

同样道理去移动绿色中心点。

k均值聚类算法实现代码 k均值聚类算法例子_数据_04

移动之后,重新分组数据:

k均值聚类算法实现代码 k均值聚类算法例子_聚类_05


重复执行:

k均值聚类算法实现代码 k均值聚类算法例子_k均值聚类算法实现代码_06


看看,数据分类是不是差不多了~!!

这是k-mean聚类算法的伪代码:

Repeat {
for i = 1 to m
c(i) (i)
for k = 1 to K
μk  := average (mean) of points assigned to cluster k
}