推文介绍:
想象一下这样一个场景,假设现在手中有一个数据集,里面包含3个特征维度,但是,对于簇结构起决定性作用的只有其中2个维度,也就是说其中有一个维度是噪声维度。在这种情况下采用Kmeans聚类算法进行聚类会产生什么样的结果呢?此时我们便需要一种聚类算法能够自动帮我们识别哪些维度是噪音维度。在本节内容中将会介绍一种基于加权的Kmeans聚类算法原理与实现。
11.7 加权Kmeans聚类算法#
在前面几节内容中,我们首先介绍了Kmeans聚类算法的原理,然后介绍了一种基于Kmeans进行改进的Kmeans++聚类算法,该算法的改进点在于依次初始化K个簇中心,最大程度上使不同的簇中心彼此之间相距较远,从而避免了各个簇中心出现在同一簇中的情况。接下来,我们将继续介绍另外一种基于Kmeans改进的聚类算法——加权Kmeans聚类算法。如图11-13所示便是加权Kmeans聚类算法的学习路线图。
11.7.1 加权Kmeans算法思想#
想象一下这样一个场景,假设现在手中有一个数据集,里面包含3个特征维度,但是,对于簇结构起决定性作用的只有其中2个维度,也就是说其中有一个维度是噪声维度。在这种情况下采用Kmeans聚类算法进行聚类会产生什么样的结果呢?
现在我们人为地来构造一个数据集,其一共包含3个明显的簇结构,可视化后的结果如图11-14所示。

进一步,在图11-14所示的数据集中再加入一个噪声维度,这样便得到了另外一个新的数据集,其可视化结果如图11-15所示,其中左右两边为不同视角下的结果。

此时,对于图11-15中的结果,人眼几乎已经无法分辨其中所存在的簇结构。如果此时通过聚类对其进行聚类会出现什么样的结果呢?在通过Kmeans算法对其进行聚类后发现,此时的ARI结果已经从0.912骤然降到了0.721,完整示例代码可参见AllBooKCode/Chapter11/C09_visualization_wkmeans.py文件。为什么混入噪声维度后Kmeans聚类算法就不怎么管用了呢?
假如现在有两个簇中心$c_1=[2,3]$和$c_2=[3,5]$,样本点$x=[4,4]$。在这种情况下$d_{x{{c}_{1}}}^{2}=5$大于$d_{x{{c}_{2}}}^{2}=2$,因此样本点$x$应该被划入簇$c_2$中,但如果此时加入一列噪声维度,变成$c_1=[2,3,2]$和$c_2=[3,5,9]$,样本点变成$x=[4,4,1]$。那么在这样的情况下$d_{x{{c}_{1}}}^{2}=6$就会小于$d_{x{{c}_{2}}}^{2}=66$,此时$x$就会被错误地划分到簇$c_1$中。
可以发现,正是由于噪声维度的出现,使得Kmeans聚类算法在计算样本间的距离时把噪声维度所在的距离也一并地考虑到了结果中,最终导致聚类精度下降。有没有什么好的办法解决这个问题,使在聚类过程中尽量忽略噪声维度的影响呢?当然有,答案就是给每个特征维度赋予一个权重。
加权Kmeans聚类算法出自于2005年的一篇论文[1] 。这篇论文的核心思想就是给每个特征维度初始化一个权重值,等到目标函数收敛时噪声维度所对应的权重就会趋于0,从而使在计算样本间的距离时能够尽可能地忽略噪声维度的影响。
在上面的例子中,如果给算法
$$W=[w_1,w_2,w_3]=[0.49,0.49,0.02]$$这样一个特征权重,并且在计算样本间距离的时候考虑的是加权距离,则有
$$ \begin{aligned} & d_{x{{c}_{1}}}^{2}=0.49\times {{(4-2)}^{2}}+0.49\times {{(4-3)}^{2}}+0.02\times {{(1-2)}^{2}}=2.47 \\[1ex] & d_{x{{c}_{2}}}^{2}=0.49\times {{(4-3)}^{2}}+0.49\times {{(4-5)}^{2}}+0.02\times {{(1-9)}^{2}}=2.26 \end{aligned}\tag{11-28} $$此时可以发现,在特征权重的作用下,加权后的距离$d^2_{xc_1}$仍旧大于$d^2_{xc_2}$,$x$依然会被划分到簇$c_2$中,因此也就避免了被划分错误的情况。
11.7.2 加权Kmeans算法原理#
讲了这么多,那么加权Kmeans聚类算法是如何实现这个想法的呢?具体地,加权Kmeans聚类算法的目标函数为
$$ \begin{aligned} &P(U,Z,W)=\sum\limits_{p=1}^{k}{\sum\limits_{i=1}^{n}{{{u}_{ip}}}}\sum\limits_{j=1}^{m}{w_{j}^{\beta }}{{({{x}_{ij}}-{{z}_{pj}})}^{2}}\\[2ex] &\text{s}.\text{t}. \ \sum\limits_{p=1}^{k}{{{u}_{ip}}}=1,\ \sum\limits_{j=1}^{m}{{{w}_{j}}}=1 \end{aligned} \tag{11-29} $$从目标函数式(11-29)可以发现,相较于原始的Kmeans聚类算法,加权Kmeans聚类算法仅仅在目标函数中增加了一个权重参数$w^{\beta}_j$。它的作用在于,在最小化整个簇内距离时计算的是每个维度的加权距离和,即通过不同的权重值来调节每个维度对聚类结果的影响,并且,当$\beta=0$时,目标函数式(11-29)也就退化到了Kmeans聚类算法中的目标函数。
11.7.3 加权Kmeans算法迭代公式#
根据目标函数式(11-29)可知,其一共包含3个需要求解的参数$U$、$Z$和$W$。在这里,我们先直接给出每个参数的迭代计算公式,具体的求解过程将在11.7.4节中进行介绍。
1. 簇分配矩阵$U$
$$ {{u}_{ip}}=\begin{cases} 1, & w_{j}^{\beta }\sum\limits_{j=1}^{m}{{{({{x}_{ij}}-{{z}_{pj}})}^{2}}}\le w_{j}^{\beta }\sum\limits_{j=1}^{m}{{{({{x}_{ij}}-{{z}_{tj}})}^{2}}},\ \text{for }1\le t\le k \\ 0, & \text{其它} \\ \end{cases} \tag{11-30} $$从式(11-30)可以看出,其与Kmeans中簇分配矩阵计算方式的差别在于每个维度在计算距离时考虑了权重。
2. 簇中心矩阵$Z$
$$ {{z}_{pj}}=\frac{\sum\limits_{i=1}^{n}{{{u}_{ip}}}{{x}_{ij}}}{\sum\limits_{i=1}^{n}{{{u}_{ip}}}}\tag{11-31} $$