K-means算法学习

K-均值

是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。

k-均值是一个迭代算法,假设我们想将数据聚类为n组,过程为:

       1.首先选择k个随机的点,称为聚类中心。

       2.对于数据集中的每个数据,按照距离k个中心点的距离,将其与距离 最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。

       3.计算每组的平均值,将该组所关联的中心点移动到平均值的位置。

       4.计算每组的平均值,将该组所关联的中心点移动到平均值的位置。

       重复2-4直至中心点不再变化。

用???? 1 ,???? 2 ,...,???? ???? 来表示聚类中心,用???? (1) ,???? (2) ,...,???? (????)来存储与第????个实例数据最近的聚类中 心的索引,K-均值算法的伪代码如下:

Repeat {

for i = 1 to m

c(i) := index (form 1 to K) of cluster centroid closest to x(i)

for k = 1 to K

μk := average (mean) of points assigned to cluster k

}

算法分两个步骤,第一个for循环是赋值步骤,即:对于每一个样例 i,计算其应该属于的类。第二个for循环是聚类中心的移动,即:对于每一个类K,重新计算该类的质心。


优化目标

k-均值最小化问题,就是要最小化所有数据点与其所关联的聚类中心点的距离之和。因此,k-均值的代价函数,(又称为畸变函数)为:

K-means算法学习

其中???????? (????)代表与???? (????)最近的聚类中心点。 我们的的优化目标便是找出使得代价函数最小 的 ???? (1) ,???? (2) ,...,???? (????)和???? 1 ,???? 2 ,...,???? ????

回顾刚才给出的: K-均值迭代算法,我们知道,第一个循环是用于减小???? (????)引起的代价, 而第二个循环则是用于减小????????引起的代价。迭代的过程一定会是每一次迭代都在减小代价函 数,不然便是出现了错误。


随机初始化

在运行k均值算法之前,我们首先要随机初始化所有聚类中心的点。

1. 我们应该选择???? < ????,即聚类中心点的个数要小于所有训练集实例的数量

2. 随机选择????个训练实例,然后令????个聚类中心分别与这????个训练实例相等

k均值的一个问题就在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。为了解决这个问题,我们通常需要多次运行k均值的结果,选择代价函数最小的结果,这种方法在k较小的时候(2-10)还是可行的。如果k较大,这么做不会有明显改善。


选择聚类数

根据不同的问题,选择聚类数目。

可能会谈及一个方法叫做“肘部法则”。其含义为:改变k值,也就是聚类类别的数目。我们用一个聚类来运行k均值算法,这就意味着所有数据都会被分成一类,然后计算成本函数或者计算畸变函数。k代表聚类数目。

K-means算法学习

我们可能会得到一条类似于这样的曲线。像一个人的肘部。这就是“肘部法则”所做的, 让我们来看这样一个图,看起来就好像有一个很清楚的肘在那儿。好像人的手臂,如果你伸 出你的胳膊,那么这就是你的肩关节、肘关节、手。这就是“肘部法则”。你会发现这种模式, 它的畸变值会迅速下降,从 1 到 2,从 2 到 3 之后,你会在 3 的时候达到一个肘点。在此之 后,畸变值就下降的非常慢,看起来就像使用 3 个聚类来进行聚类是正确的,这是因为那个 点是曲线的肘点,畸变值下降得很快,???? = 3之后就下降得很慢,那么我们就选???? = 3。当你 应用“肘部法则”的时候,如果你得到了一个像上面这样的图,那么这将是一种用来选择聚类 个数的合理方法。