1. 聚类(clustering algorithm)
在前面介绍的算法中,我们给定的数据集都是包含标签的,如 { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , ⋯ , ( x ( m ) , y ( m ) ) } \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\cdots,(x^{(m)},y^{(m)})\} {(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))},其中的标签表明了数据的类别,算法可以根据标签得到数据的模型。
但是有一种没有标签的数据,如 { x ( 1 ) , x ( 2 ) , ⋯ , x ( m ) } \{x^{(1)},x^{(2)},\cdots,x^{(m)}\} {x(1),x(2),⋯,x(m)},其中的每个样本点没有固定的标签,聚类算法要做的就是根据这些无标签的数据,找到隐含在其中的结构信息。如下图所示,对于图中数据点,可以根据数据的特征将数据分为两个簇(cluster)。对无标签的数据进行学习的算法称为无监督学习(unsupervised learning)。
2. K-Means 聚类算法
2.1 K-Means 的基本概念
K-Means 算法将一组没有标签的数据分为 K 个相关的子集或簇,即簇的数量 K 是事先指定的。为了将如下的数据分为两类,使用 K-Means 算法的步骤如下:
-
随机生成如下两个点,称为 聚类中心(Cluster Centroids)。选择两个点的原因是因为想把这些数据聚为两类。
、
-
簇分配。遍历数据集中的每个样本,计算样本和每个聚类中心的距离,并选择距离最近的样本中心作为自己所属的类别,下图中将所有样本点分为红色和蓝色两类。
-
移动聚类中心。计算同一类数据点的均值,并将聚类中心移动到均值处。在上图中,首先计算所有红色点的均值,然后将红色的聚类中心移动到均值处;再计算蓝色点的均值,并移动蓝色的聚类中心,得到下图。
-
得到新的聚类中心后,我们对所有的样本点都重新分类,即重复第二步和第三步,直到聚类中心不再发生变化。如下所示
-
最终,所有样本被分为两类。
所以,整个 K-Means 算法可以总结如下:
输入:
\quad 1. 聚类的类别数 K K K
\quad 2. 训练集 { x ( 1 ) , x ( 2 ) , ⋯ , x ( m ) } \{x^{(1)},x^{(2)},\cdots,x^{(m)}\} {x(1),x(2),⋯,x(m)}
随机初始化 K 个聚类中心: μ 1 , μ 2 , ⋯ , μ K ∈ R n \mu_1,\mu_2,\cdots,\mu_K \in \mathbb{R}^n μ1,μ2,⋯,μK∈Rn
do{
f o r i = 1 t o m \quad for\ i=1 \ to \ m for i=1 to m
c ( i ) = i n d e x o f c l u s e t e r c e n t r o i d c l o s e s t t o x ( i ) \quad \quad c^{(i)} = index\ of \ cluseter\ centroid\ closest\ to\ x^{(i)} c(i)=index of cluseter centroid closest to x(i) (根据 x ( i ) x^{(i)} x(i) 与每个聚类中心的距离将其分类为 c ( i ) c^{(i)} c(i))
f o r k = 1 t o K \quad for\ k=1 \ to \ K for k=1 to K
μ k = a v e r a g e o f p o i n t s a s s i g n e d t o c l u s t e r k \quad \quad \mu_k = average\ of \ points \ assigned \ to \ cluster \ k μk=average of points assigned to cluster k (根据第 k 类的所有数据点更新聚类中心)
}while(!convergence)
2.2 K-Means 的代价函数
如果使用
c
(
i
)
c^{(i)}
c(i) 表示样本
x
(
i
)
x^{(i)}
x(i) 所属的分类,
μ
k
\mu_k
μk 表示第
k
k
k 类的聚类中心,
μ
c
(
i
)
\mu_{c^{(i)}}
μc(i) 表示类别为
c
(
i
)
c^{(i)}
c(i) 的聚类中心(即,若样本
x
(
i
)
x^{(i)}
x(i) 被划分为第五类,那么
c
(
i
)
=
5
c^{(i)}=5
c(i)=5,
μ
c
(
i
)
=
μ
5
\mu_{c^{(i)}}=\mu_5
μc(i)=μ5 )。则K-Means 算法中的代价函数可以表示如下,该代价函数也称为 失真函数(distortion function):
J
(
c
(
1
)
,
⋯
,
c
(
m
)
,
μ
1
,
⋯
,
μ
K
)
=
1
m
∑
i
=
1
m
∥
x
(
i
)
−
μ
c
(
i
)
∥
2
J(c^{(1)},\cdots,c^{(m)},\mu_1,\cdots,\mu_K)=\frac{1}{m}\sum_{i=1}^m\|x^{(i)}-\mu_{c^{(i)}}\|^2
J(c(1),⋯,c(m),μ1,⋯,μK)=m1i=1∑m∥x(i)−μc(i)∥2
其中 ∥ x ( i ) − μ c ( i ) ∥ 2 \|x^{(i)}-\mu_{c^{(i)}}\|^2 ∥x(i)−μc(i)∥2 表示样本 x ( i ) x^{(i)} x(i) 与聚类中心 μ c ( i ) \mu_{c^{(i)}} μc(i) 距离的平方。
K-Means 的优化目标就是找到能使
J
J
J 最小的参数
c
(
1
)
,
⋯
,
c
(
m
)
,
μ
1
,
⋯
,
μ
K
c^{(1)},\cdots,c^{(m)},\mu_1,\cdots,\mu_K
c(1),⋯,c(m),μ1,⋯,μK,即:
min
c
(
1
)
,
⋯
,
c
(
m
)
,
μ
1
,
⋯
,
μ
K
J
(
c
(
1
)
,
⋯
,
c
(
m
)
,
μ
1
,
⋯
,
μ
K
)
\min_{c^{(1)},\cdots,c^{(m)}, \atop \mu_1,\cdots,\mu_K } J(c^{(1)},\cdots,c^{(m)},\mu_1,\cdots,\mu_K)
μ1,⋯,μKc(1),⋯,c(m),minJ(c(1),⋯,c(m),μ1,⋯,μK)
在 K-Means 算法中, f o r i = 1 t o m for\ i=1 \ to \ m for i=1 to m是簇分配的过程,其对应为找到使代价函数最小的参数 c ( 1 ) , ⋯ , c ( m ) c^{(1)},\cdots,c^{(m)} c(1),⋯,c(m); f o r k = 1 t o K for\ k=1 \ to \ K for k=1 to K 是移动簇中心的操作,对应为找到使代价函数最小的参数 μ 1 , ⋯ , μ K \mu_1,\cdots,\mu_K μ1,⋯,μK。
2.3 随机初始化的方法
K-Means 的第一步是随机选择一些点作为聚类中心,但是随机选择的点最终得到的结果可能只是局部最优点,如下图所示,左边表示我们期望得到的聚类结果,但是右边两幅图都是局部最优的聚类结果。为了避免局部最优的情况,可以通过如下的方式来解决。
- 随机选择 K K K 个样本作为初始的聚类中心。
- 多次随机初始化。通过多次随机初始化聚类中心,运行多次算法,得到多个聚类结果,在最终的聚类结果中选择代价函数最小的一个。只要聚类的数据比较小,如 K = 1 , 2 , ⋯ , 9 K=1,2,\cdots ,9 K=1,2,⋯,9 等,通过多次随机初始化一般都能得到较好的聚类结果。
2.4 聚类个数的选择
对于一些未知的数据,我们事先是不知道可以将其聚类为多少类的,如下所示,对于同样的数据集,可能会有不同的聚类数目,对于给定的数据集,我们怎么才能正确的选择合适的聚类数目呢?
-
肘部法则(Elbow Method)
依次选择不同个数的聚类数目,根据不同的聚类数目进行聚类,并计算该聚类数目下的损失函数 J J J,就可以得到如下的损失函数曲线,对于如下的曲线,存在一个拐点,经过该拐点之后,损失函数并没有再次快速下降,所以我们就可以把聚类数目选为拐点对应的 K K K。
但是通过这种方式可能得到的曲线并不存在拐点,如下所示,这时我们就不能根据该曲线确定聚类数目了。
-
根据最终目的选择聚类数目
很多时候我们并不直到到底哪个聚类数目更合适,这个时候我们可以根据我们想要达成的目的来对聚类结果进行评估,找到满足需求的聚类数目。例如,对于 T-shirt 的尺寸分类,我们可以为不同身高和体重的人设置不同大小的 T-shirt,但是我们是选择 S、M 和 L ,或者选择 XS、S、M、L、XL 是根据顾客的需求设置的,我们应该选择更能满足客户需求的情况进行聚类。