机器学习(五)聚类算法(k-means,)

一、常见的聚类算法

聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。

​主要的聚类算法可以划分为如下几类:划分方法、层次方法、基于密度的方法、基于网格的方法以及基于模型的方法。下面主要对k-means聚类算法、凝聚型层次聚类算法、神经网络聚类算法之SOM,以及模糊聚类的FCM算法通过通用测试数据集进行聚类效果的比较和分析。

二、k-means聚类

1. 基本思想

通过迭代的方式寻找 k 个簇的划分方案,使得聚类结果对应的代价函数最小。代价函数可以定义为各个样本距离它所属的簇中心点的误差平方和:

J ( c , μ ) = ∑ i = 1 N ∣ ∣ x i − μ c i ∣ ∣ 2 J(c, \mu)=\sum_{i=1}^{N} || x_i-\mu_{c_i} ||^2 J(c,μ)=i=1N∣∣xiμci2
其中, x i x_{i} xi代表第i个样本, c i c_{i} ci x i x_{i} xi所属的簇, μ c i \mu_{c_{i}} μci代表簇对应的中心点(即均值),N是样本总数.

2. 算法流程

采用了贪心策略,通过多次迭代近似求解代价函数。

  1. 随机选取 k k k 个点作为初始聚类中心,记为 μ 1 ( 0 ) , μ 2 ( 0 ) , . . . , μ k ( 0 ) \mu_{1}^{(0)},\mu_{2}^{(0)},...,\mu_{k}^{(0)} μ1(0),μ2(0),...,μk(0)
  2. 计算每个样本 x i x_{i} xi 到各个簇中心的距离,将其分配到与它最近距离的簇
    c i ( t ) ← arg min ⁡ k ′ ∣ ∣ x i − μ k ′ ( t ) ∣ ∣ 2 c_{i}^{(t)} \leftarrow \argmin_{k'}|| x_i -\mu_{k'}^{(t)}||^2 ci(t)argmink∣∣xiμk(t)2
  3. 对于每个簇,利用该簇中的样本重新计算该簇的中心(均值向量):
    μ k ( t + 1 ) ← arg min ⁡ μ ∑ ∣ ∣ x i − μ ∣ ∣ 2 \mu_k^{(t+1)} \leftarrow\argmin_{\mu}\sum||x_i-\mu||^2 μk(t+1)argminμ∣∣xiμ2
  4. 重复迭代,若聚簇结果保持不变,结束。

3. 优缺点

优点:

  • 原理简单,满足常见需求
  • 对于大数据集相对可伸缩且高效

缺点:

  • 初值选取较难
  • k 均值只能做到局部最优
  • 受初值和离群点影响大
  • 样本只能被划分到单一类别中

4. k值如何选取

1) 多次聚类结果的评价曲线图,选择拐点(下降的快到慢的点)

2) Gap Statistic

定义为:
G a p ( k ) = E ( l o g D k ) − l o g D k Gap(k)=E(logD_k)-logD_k Gap(k)=E(logDk)logDk
其中, D k D_{k} Dk是第k簇聚类对应的损失值, E ( l o g D k ) E(logD_{k}) E(logDk) l o g D k logD_{k} logDk的期望。

对于上式的 E ( l o g D k ) E(logD_{k}) E(logDk),一般通过蒙特卡洛模拟产生。具体操作是:在样本所在的区域内,按照均匀分布随机产生和原样本数目一样的随机样本,计算这些随机样本的均值,得到一个 D k D_{k} Dk,重复多次即可计算出 E ( l o g D k ) E(logD_{k}) E(logDk) 的近似值。

G a p ( k ) Gap(k) Gap(k) 可以看做是随机样本的损失与实际样本的损失之差,假设实际样本最佳的簇类数目为 k,那么实际样本的损失应该相对较小,随机样本的损失与实际样本的损失的差值相应地达到最大,即最大的 G a p ( k ) Gap(k) Gap(k) 值应该对应最佳的k值。

因此,我们只需要用不同的k值进行多次实验,找出使得 G a p ( k ) Gap(k) Gap(k)最大的k即可。

到现在为止我们可以发现,上面的算法中,k值都是通过人为地凭借经验或者多次实验事先确定下来了的,但是当我们遇到高维度、海量的数据集时,可能就很难估计出准确的k值。那么,有没有办法可以帮助我们自动地确定k值呢?有的,下面来看看另一个算法。

3) ISODATA算法

ISODATA,全称是迭代自组织数据分析法,针对传统 k-means 算法需要人为地预先确定 k 值而改进的,主要思想是:

  • 当某个类别样本数过多,分散程度较大时,将该类别分为两个子类(分裂操作,增加聚类中心数)
  • 当属于某个类别的样本数目过少时,把该类别去掉(合并操作,减少聚类中心数)

优点:可以自动寻找合适的 k 值

缺点: 除了要设置一个参考聚 类数量 k 0 k_{0} k0 外,还需要指定额外的3个阈值,来约束上述的分裂和合并操作。具体如下:

  1. 预期的聚类数目 k 0 k_{0} k0 作为参考值,最终的结果在 k 0 k_{0} k0 的一半到两倍之间。
  2. 每个类的最少样本数目 N m i n N_{min} Nmin,若分裂后样本数目会少于该值,则该簇不会分裂。
  3. 最大方差 S i g m a Sigma Sigma,用于控制某个簇的样本分散程度,操作该值且满足条件2,则分裂成两个簇。
  4. 两个簇最小距离 D m i n D_{min} Dmin,若两个簇距离小于该值,则合并成一个簇。

三、层次聚类算法

根据分解的顺序时自下而上还是自上而下,层次聚类算法分为凝聚的层次聚类和分裂的层次聚类
凝聚性层次聚类的策略是先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被满足。绝大多数层次聚类属于凝聚性层次聚类,只在簇间相似度的定义上有所不同。

流程:以采用最小距离的凝聚层次聚类为例:

  1. 将每个对象看作一类, 计算两两之间的最小距离
  2. 将距离最小的两个类合并一个新类
  3. 重新计算新类与所有类的距离
  4. 重复2、3,直到所有类合并成一类

四、SOM聚类算法

假设在输入对象中存在一些拓扑结构或顺序,可以实现从输入空间到输出空间的降维映射,其映射具有拓扑性质,与实际的大脑处理很有理论联系

流程:

  1. 网络初始化,对输出层每个结点权重赋值
  2. 从输入样本中随机选取输入向量并归一化,找到与输入向量距离最小的权重向量
  3. 定义获胜单元,在获胜单元的临近区域调整权重使其向输入向量靠拢
  4. 提供新样本进行训练
  5. 收缩领域半径,减小学习率,重复直到小于阈值,输出聚类结果

五、FCM聚类(模糊聚类)

六、高斯混合模型

你可能感兴趣的:(机器学习)