机器学习 - K-Means、K-Means++ 以及 ISOData

机器学习 - K-Means、K-Means++ 以及 ISOData

K-Means、K-Means++ 以及 ISOData 都是聚类算法,它们通过计算样本点到聚类中心的距离来进行类别划分。下面分别介绍这三种方法。

  • K-Means

    “物以类聚,人以群分”,K-Means 算法就是降相似的样本划定为同一类别,而其中的 K 是指将数据聚成 K 类。

    算法步骤:

    1. 从数据集构成的样本空间中随机选取 K 个聚类中心 C={c1,c2,...,ck}C=\{c_1,c_2,...,c_k\}
    2. 对每一个样本 xix_i 计算其到 K 个聚类中心的距离,即每个样本 xix_i 计算 K 个距离 Dk,xi={Dc1,Dc2,...,Dckxi}D_{k,x_i}=\{D_{c_1},D_{c_2},...,D_{c_k}|x_i\},并将距离最近的中心所代表的类别设为 xix_i 类别。
    3. 针对每个中心 c1,c2,...,ckc_1,c_2,...,c_k,分别计算各自从属它们的所有样本的中心:cj=1Ncjxcjxij=1,2,...,kc_j=\frac{1}{N_{c_j}}\sum_{x∈c_j}x_i,j=1,2,...,k
    4. 重复 2,3 步直到聚类中心不在变化,或变化小于某一阈值

    对于 K-Means 算法,类别个数 K 的选取十分重要:

    1. K 值越小,模型越欠拟合,偏差越大,对数据不能充分学习(一个簇类包含了一半的数据,效果应该不会太好)。

    2. K 值越大,模型越容易过拟合,方差越大,对噪声敏感。(有可能将几个噪声点也划分出一个类别,这也是不好的)

      (对偏差与方差的讲解可参照此文 机器学习 - KNN、偏差与方差

    对于 K 值,要与 KNN 中的 K 有所区分

    1. KNN 中的 K 是指被分类样本类别的决策,受周围 K 个样本影响;
    2. K-Means 中的 K 是指最终样本要被划分成 K 个类别。

    在 K-Means 算法中,第一步:初始聚类中心的选取也非常重要,K-Means 对初始聚类中心是敏感的,会影响到最终的聚类结果。

    针对 K-Means 算法对于 K 值地选取以及初始聚类中心的选取两个薄弱点,可以适用 K-Means++ 与 ISOData 方法进行改进。

  • K-Means++

    K-Means++ 的改进思想为:对于初始聚类中心,我们尽可能地让各聚类中心之间距离尽可能地远,也就是让聚类划分的类别之间区别尽量明显。

    假设 K=4K=4

    1. 从数据集中随机选取 1 个样本最为第一个初始聚类中心 :c1=xrandomc_1=x_{random}

    2. 而后对每一个样本点计算其到所有 已有中心 的距离,并选取最小值设为此样本的 D(x)D(x)

    3. 计算每个样本被选为下一个聚类中心的概率 P(x)=D2(x)xXD2(x)P(x)=\frac{D^2(x)}{\sum_{x∈X} D^2(x)},并计算所有样本按序号顺序排列后的累积概率 Psum(xi)P_{sum}(x_i),并以此生成累计概率分布。

      例如,P(x1)=0.3,P(x2)=0.4,P(x3)=0.3P(x_1)=0.3,P(x_2)=0.4,P(x_3)=0.3,则 Psum(x2)=0.3+0.4=0.7,Psum(x3)=0.7+0.3=0.8P_{sum}(x_2)=0.3+0.4=0.7,P_{sum}(x_3)=0.7+0.3=0.8

      样本序号 x1x_1 x2x_2 x3x_3
      P(xi)P(x_i) 0.3 0.4 0.3
      Psum(xi)P_{sum}(x_i) 0.3 0.7 1
    4. Psum(xi)P_{sum}(x_i) 可获得概率区间:[0,0.3)[0.3,0.7)[0.7,1][0,0.3),[0.3,0.7),[0.7,1]

    5. [0,1][0,1] 中选出一个随机数 rrrr 在哪个区间中,此区间对应的样本则成为一个聚类中心

    6. 重复 2,3,4,5 直到聚类中心个数等于 KK

    7. 在确定好初始聚类中心后,按照一般 K-Means 的方法进行计算,直到迭代停止

  • ISOData

    ISOData 算法可以对 K 值进行实时修改,

    1. 设定一个初始 K 值 K0K_0
    2. 当一个类别中的样本少于一个阈值时就将此类别删去,K=K-1,并重新分配没有此类别下的样本
    3. 当类别个数 K<K02K<\frac{K_0}{2} 时,说明此时类别太少,进行分裂操作
    4. 当类别个数 K>2K0K>2K_0 时,说明此时类别太多,进行合并操作
    5. 重复 2,3,4 直到迭代停止

    对于详细分裂与合并操作可参考此文 分裂与合并

    由以上步骤可以发现,虽然 ISOData 方法可以实时修改类别个数,但是仍然需要人为设置很多的阈值与参数,所以并不是非常受欢迎。

  • K-Means 与 KNN 比较

    项目 KNN K-Means
    分类聚类 分类算法 聚类算法
    过程 直接计算 有训练过程
    k 值的含义 受周围 k 个样本影响 要划分的类别个数
    确定性 一旦 k 值确定,各样本类别即确定 每次迭代后类别可能改变

    对于 K-Means 还可从 EM 角度进行解释,对此内容以后再做讲解。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读