编程语言
首页 > 编程语言> > 机器学习:K-Means聚类算法及FCM与SOM算法

机器学习:K-Means聚类算法及FCM与SOM算法

作者:互联网

目录

K-Means 等聚类算法

K-Means 算法及扩展

经典 K-Means 算法

K-Means 算法是无监督的聚类算法, 给定样本集 \(D = \{ \mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_N \}\), 假设簇划分为 \(\mathcal{C} = \{C_1, C_2, \cdots, C_k\}\), K-Means 算法的目标是最小化平方误差:

\[E = \sum_{i=1}^k \sum_{\mathbf{x} \in C_i} || \mathbf{x} - \mathbf{\mu}_i|| ^2_2 \]

其中 \(\mathbf{\mu}_i = \frac{1}{|C_i|}\sum_{\mathbf{x} \in C_i}\mathbf{x}\) 是簇 \(C_i\) 的均值向量. \(E\) 值越小则簇内样本相似度越高. 找到上式的最优解需要考察样本集所有可能的簇划分, 这是一个 NP 难问题, K-means 算法采用了贪心策略迭代优化来近似求解. 下面叙述经典 K-Means (naïve k-means) 算法主要步骤, 给定样本集 \(D = \{ \mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_N \}\), 聚类簇数 \(k\).

算法重复执行分配和更新步骤, 直到达到某个停止条件, 例如最大迭代步数 \(N\), 最小误差变化, 或者聚类中心不发生变化等.

K-means 算法是解决聚类问题的经典算法, 这种算法简单快速, 当结构集是密集的, 簇与簇之间区别明显时, 聚类的结果比较好. 在处理大量数据时, 该算法具有较高的可伸缩性和高效性, 它的时间复杂度为 \(O (NkT)\), 其中 \(T\) 是算法的迭代次数. 但是, 经典的 K-means 算法也存在如下缺点:

  1. K-Means聚类算法需要预先指定聚类的个数 \(k\) 值, 但在很多时候 \(k\) 值难以估计.
  2. 对初始聚类中心敏感, 选择不同的聚类中心会产生不同的聚类结果, 随机选取初始聚类中心的做法会导致算法的不稳定性, 有可能陷入局部最优的情况.
  3. 对噪声和孤立点数据敏感, K-Means 算法将簇的质心看成聚类中心加入到下一轮计算当中, 因此少量的噪声和孤立点能够对平均值产生极大影响, 导致结果的不稳定甚至错误.
  4. 无法发现任意簇, 一般只能发现球状簇. 因为 K-Means 算法主要采用欧式距离函数度量数据对象之间的相似度, 并且采用误差平方和作为目标函数, 通常只能发现数据对象分布较均匀的球状簇.

K-Means++ 算法

经典 K-Means 算法随机选取初始聚类中心, 对最后的聚类结果和运行时间都有很大的影响, 也可能导致算法收敛很慢, K-Means++ 算法针对初始化过程对经典 K-Means 算法进行优化. 经典 K-Means 算法的初始化过程是随机选取数据集中 \(k\) 个点作为聚类中心, 而 K-Means++ 按照如下的思想选取 \(k\) 个聚类中心: 假设已经选取了 \(n\) (\((0<n<k)\)) 个初始聚类中心, 则在选取第 \(n+1\) 个聚类中心时, 距离当前 \(n\) 个聚类中心越远的点会有更高的概率被选为第 \(n+1\) 个聚类中心. 具体来说, 优化策略如下:

  1. 从输入的样本集数据点中随机选择一个点作为第一个聚类中心 \(\mathbf{\mu}_1\).

  2. 首先计算每个样本点与当前已有聚类中心之间的最短距离 (即与最近的一个聚类中心的距离)

    \[D(\mathbf{x}) = \arg\min_{r} ||\mathbf{x}_i - \mathbf{\mu}_r||^2_2 \]

    \(D(\mathbf{x})\) 较大的点被选为新的聚类中心.

  3. 重复第 2 步直至选出 \(k\) 个聚类中心, 其余部分与经典 K-Means 算法相同.

elkan K-Means 算法

经典 K-Means 算法在每轮迭代时要计算所有样本点到所有的聚类中心的距离, elkan K-Means 算法利用三角形不等式的性质, 来减少不必要的距离计算, 具体地说有如下两种规律:

  1. 对于一个样本点 \(\mathbf{x}\) 和两个聚类中心 \(\mathbf{\mu}_{j_1}\) 和 \(\mathbf{\mu}_{j_2}\), 若预先计算出聚类中心之间的距离 \(D(\mathbf{\mu}_{j_1}, \mathbf{\mu}_{j_2})\), 则如果有 \(2D(\mathbf{x}, \mathbf{\mu}_{j_1}) < D(\mathbf{\mu}_{j_1}, \mathbf{\mu}_{j_2})\), 那么有 \(D(\mathbf{x}, \mathbf{\mu}_{j_1}) < D(\mathbf{x}, \mathbf{\mu}_{j_2})\), 此时不需要另外计算 \(D(\mathbf{x}, \mathbf{\mu}_{j_2})\).
  2. 对于一个样本点 \(\mathbf{x}\) 和两个聚类中心 \(\mathbf{\mu}_{j_1}\) 和 \(\mathbf{\mu}_{j_2}\), 可以得到 \(D(\mathbf{x}, \mathbf{\mu}_{j_2}) \geq \max\{0, D(\mathbf{x}, \mathbf{\mu}_{j_1}) - D(\mathbf{\mu}_{j_1}, \mathbf{\mu}_{j_2})\}\).

利用上面两个规律, 可以提高 K-Means 算法的迭代速度.

Mini Batch K-Means 算法

经典 K-Means 算法需要计算所有样本点到所有的聚类中心的距离, 但当样本量非常大时会十分耗时. Mini Batch K-Means 算法是经典 K-Means 算法的一种优化变体, 它采用小规模的数据子集减少计算时间, 同时试图优化目标函数, Mini Batch K-Means 算法可以减少 K-Means 算法的收敛时间, 而且产生的结果效果只是略差于经典 K-Means 算法. 在 Mini Batch K-Means 算法中, 每一轮训练所使用的数据集是在训练算法时随机抽取的数据子集, 一般是通过无放回的随机采样得到的, 另外为了增加算法的准确性, 一般会多跑几次 Mini Batch K-Means 算法, 用得到不同的随机采样集来得到聚类簇, 选择其中最优的聚类簇. Mini Batch K-Means 算法主要步骤如下:

  1. 首先抽取部分数据集, 使用 K-Means 算法构建出 \(k\) 个聚类中心的模型.
  2. 继续抽取训练数据集中的部分数据集样本数据, 并将其添加到模型中, 分配给距离最近的聚类中心.
  3. 更新聚类中心.
  4. 循环迭代第 2 步和第 3 步, 直到聚类中心稳定或者达到迭代次数.

FCM 聚类算法

FCM (Fuzzy C-Means, 模糊 C 均值) 算法是由 Dunn 在 1973 年引入的一种基于目标函数优化的软聚类算法. 在软 (模糊) 聚类中, 每个样本都有一组对应于给定聚类中心集合的隶属度, 越靠近聚类中心的样本点拥有更高的对该聚类中心的隶属度. FCM 算法将样本集划分为若干个模糊类, 同时寻找它们的最优聚类中心, 最终聚类结果为每个样本对每个聚类中心的隶属度, 隶属度在 \([0,1]\) 之间.

设样本集 \(D = \{ \mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_N \}\), 其对应的聚类中心集合表示为 \(\{ \mathbf{\nu}_1, \mathbf{\nu}_2, \cdots, \mathbf{\nu}_K \}\), \(K\) 为聚类数. \(\mu_{ij}\) 是样本 \(i\) 对聚类中心 \(j\) 的隶属度, 它满足如下条件, 即任一样本对于各个聚类的隶属度之和为 \(1\) 的归一化约束条件:

\[\sum_{j=1}^K \mu_{ij} = 1, \ i = 1,2,\cdots, N \]

聚类中心可以表示为:

\[\nu_j = \frac{\sum_{i=1}^N \mu_{ij}^\beta \mathbf{x}_i}{\sum_{i=1}^N \mu_{ij}^\beta} \]

其中 \(\beta\) 是控制模糊程度的参数, 且 \(\beta >0\), 参数 \(\beta\) 对 FCM 算法有重要影响, 例如决定聚类的模糊程度, 控制样本在类间的分享程度以及抑制噪声等. 于是, FCM 算法可表示为在上述约束条件下, 每个样本 \(\mathbf{x}_i\) 到每一个聚类中心 \(\nu_i\) 隶属度的总最大化, 它可以转化为最小化如下目标函数:

\[\min J_{\beta} = \sum^N_{i=1}\sum^K_{j=1} \mu_{ij}^\beta d_{ij} \]

这里的 \(d_{ij}\) 是第 \(i\) 个样本对第 \(j\) 个聚类中心的距离, 例如取 Euclidean 距离时, \(d_{ij} = ||\mathbf{x}_i-\mathbf{\nu}_j||^2_2\).

构造对应的拉格朗日函数为:

\[L(\mu_{ij},\mathbf{\nu}_j,\lambda_i) = \sum^N_{i=1}\sum^K_{j=1} \mu_{ij}^\beta d_{ij} + \sum^N_{i=1}\lambda_i \left(\sum_{j=1}^K \mu_{ij} - 1\right) \]

其中 \(\lambda_i\) 为拉格朗日乘子, 分别对 \(\mu_{ij}\), \(\mathbf{\nu}_j\) 以及 \(\lambda_i\) 求导并置 \(0\) 最终可得隶属度, 表示为:

\[\mu_{ij} = \frac{1}{\sum^K_{k=1}\left( \frac{d_{ij}}{d_{ik}} \right)^{2/(\beta-1)}} \]

下面将 FCM 算法主要步骤总结如下, 给定聚类簇数 \(K\) 以及参数 \(\beta\).

算法迭代终止条件为:

\[||U^{(t+1)} - U^{(t)}|| < \varepsilon \]

K-Means 算法与 FCM 算法都是无监督聚类算法, 但 K-Means 算法属于硬聚类算法, 相比于 FCM 算法 (软聚类算法) 中隶属度取值在 \([0,1]\) 之间, K-Means 算法中的隶属度只能取 \(0\) 和 \(1\) 两个值.

SOM 自组织映射地图

SOM (self-organization map, 自组织映射地图) 是一种全连接的自组织竞争型神经网络,它以无监督聚类的方法建立一个映射地图,将高维特征之间复杂的非线性统计关系映射为低维关系,并能够保持拓扑关系相似性。

SOM 由输入层和竞争层两层组成, 下图展示了典型的 SOM 拓扑结构, 它的竞争层由 \(4 \times 4\) 个神经元按照正六边形网格拓扑结构排列. 输入层的节点个数为 \(m\), 即输入样本特征向量 \(\mathbf{x} = [x_1,x_2,\cdots,x_m]^T\) 的维数. 竞争层也称为输出层, 通常由有限个数的节点在特征空间上以特定的几何拓扑关系排列, 节点位置通过迭代的方式自适应地进行调整, 进而导致输入样本空间中相近的输入样本被映射到相同的节点, 因此可以代表多维样本特征空间. 每一个竞争层节点的权向量可以表示 \(\mathbf{\omega}_j = [ \omega_{j1}, \omega_{j2},\cdots,\omega_{jN} ]^T\), \(j = 1,2,\cdots,l\), 其中 \(l\) 表示竞争层神经元的总个数, 这里的权向量可以看作每个聚类簇的中心 (prototypes or centroids of clusters of input vectors). 注意这里的竞争层也可以有更高的维度, 但从可视化的角度来看, 高维竞争层用的较少, 另外二维竞争层除正六边形拓扑结构外, 还可以选择方形拓扑结构. 在确认竞争层节点数量时可参考 SOM 网络的提出者 Kohonen 所给出的的经验公式:

\[l = 5\sqrt{N} \]

kmeans_som1
SOM 网络的典型拓扑结构

SOM 的主要学习算法可以总结为以下两步:

  1. 节点竞争:

    对每一个输入样本 \(\mathbf{x}\), 计算竞争层节点与输入样本间的相似度 (通常使用欧式距离), 具有最大相似度的节点被称为获胜节点 (winner node, 或称 BMU, best matching unit). 搜索竞争层节点与输入样本相似度最大值可以转化为搜索竞争层节点与输入样本欧式距离最小值. 获胜节点可以如下定义为:

    \[i(\mathbf{x}) = \arg\min_j \{||\mathbf{x} - \mathbf{\omega}_j||\}, \ j = 1,2,\cdots,l \label{winner} \]

  2. 节点更新:

    获胜节点及其邻域节点权向量根据当前输入样本 \(\mathbf{x}\) 进行迭代更新,其第 \(t\) 迭代的更新公式如下:

    \[\mathbf{\omega}_j(t+1) = \mathbf{\omega}_j(t) + \alpha(t)h(j,i;t)[\mathbf{x} - \mathbf{\omega}_j(t)] \]

    其中,

    \[h(i,j;t) = \exp \left\{ -\frac{||\mathbf{\omega}_j(t)-\mathbf{\omega}_i(t)||}{\sigma^2(t)} \right\} \]

    \[\alpha(t) = \alpha_0(\alpha_T/\alpha_0)^{t/T} \]

    \[\sigma(t) = \sigma_0(\sigma_T/\sigma_0)^{t/T} \]

    \(h\) 是高斯函数, 控制获胜节点 \(i\) 与其相关联的拓扑邻域节点 \(j\) 权向量更新程度, 从而与算法背后的生物背景平行. \(\alpha_t\) 是每次迭代的学习率, \(T\) 是总迭代步长, \(\alpha_0\) 是初始学习率, \(\alpha_T\) 是最终学习率. \(\sigma_t\) 是每次迭代的邻域半径, \(\sigma_0\) 是初始邻域半径, \(\sigma_T\) 是最终邻域半径. 这里的学习率与每次迭代的邻域半径随着迭代次数是逐步衰减的, 其衰减形式也可以参考其他衰减函数.

SOM 聚类通过迭代输入训练集中的样本, 训练相应的竞争层节点权重, 在迭代训练达到稳定后, 所有的竞争层节点便可以代表整个样本集, 每一个节点可以看作样本集中的一小类的代表元. 即每一个样本 \(\mathbf{x}\) 将被归类到其获胜节点所代表的那一类中, 其聚类公式可由之前所述公式 \(\eqref{winner}\) 表示.

在对样本进行聚类时可以采取批处理策略, 不同于增量式更新策略的每次迭代依次输入样本计算对应的获胜节点并更新, 而是在每一次迭代开始时计算每一个输入样本对应的获胜节点, 然后依次更新对应的获胜节点. 采用这种策略能极大的加快整体速度, 并且不会影响最终的聚类结果.

另外为了避免在训练过程中部分节点远离其他获胜节点, 权值无法得到更新, 产生所谓的 “死节点”, 可以随机选择与竞争层节点数量相同的样本特征向量, 任意选择其中一个特征并按照其取值由小到大排列, 顺序赋给节点权值进行初始化, 然后为其添加随机分量.

K-Means 算法与 SOM 算法都是无监督聚类算法, 但 SOM 算法具备更好的可视化效果, 可以将多维样本空间映射到低维; SOM 在更新节点向量 (相当于聚类中心) 时, 可以没有任何输入样本属于某些节点, 而 K-Means 算法每个聚类中心都代表了一类样本子集; SOM 算法在节点更新时使用了近邻函数的形式, 不仅更新该节点的权重向量, 同时也会更新邻近的节点.

REFERENCE

  1. 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.
  2. K-Means聚类算法原理
  3. K-Means聚类算法的研究与改进
  4. K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比
  5. scikit-learn 2.3. Clustring
  6. A Comparative study Between Fuzzy Clustering Algorithm and Hard Clustering Algorithm
  7. Kohonen T. The self-organizing map[J]. IEEE Proc Icnn, 1990, 1(1–3):1-6.
  8. Kohonen, T., Hynninen, J., Kangas, J., Laaksonen, J.: Som pak: The self-organizing map program package[R]. Helsinki University of Technology, Laboratory of Computer and Information Science, 1996
  9. Minimalistic implementation of the Self Organizing Maps (SOM)

标签:mathbf,Means,样本,SOM,mu,算法,聚类
来源: https://www.cnblogs.com/funmore233/p/14157657.html