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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37352167/article/details/84975955

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

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

  • K-Means

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

    算法步骤:

    1. 从数据集构成的样本空间中随机选取 K 个聚类中心 C = { c 1 , c 2 , . . . , c k } C=\{c_1,c_2,...,c_k\}
    2. 对每一个样本 x i x_i 计算其到 K 个聚类中心的距离,即每个样本 x i x_i 计算 K 个距离 D k , x i = { D c 1 , D c 2 , . . . , D c k x i } D_{k,x_i}=\{D_{c_1},D_{c_2},...,D_{c_k}|x_i\} ,并将距离最近的中心所代表的类别设为 x i x_i 类别。
    3. 针对每个中心 c 1 , c 2 , . . . , c k c_1,c_2,...,c_k ,分别计算各自从属它们的所有样本的中心: c j = 1 N c j x c j x i j = 1 , 2 , . . . , k c_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 = 4 K=4

    1. 从数据集中随机选取 1 个样本最为第一个初始聚类中心 : c 1 = x r a n d o m c_1=x_{random}

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

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

      例如, P ( x 1 ) = 0.3 , P ( x 2 ) = 0.4 , P ( x 3 ) = 0.3 P(x_1)=0.3,P(x_2)=0.4,P(x_3)=0.3 ,则 P s u m ( x 2 ) = 0.3 + 0.4 = 0.7 , P s u m ( x 3 ) = 0.7 + 0.3 = 0.8 P_{sum}(x_2)=0.3+0.4=0.7,P_{sum}(x_3)=0.7+0.3=0.8

      样本序号 x 1 x_1 x 2 x_2 x 3 x_3
      P ( x i ) P(x_i) 0.3 0.4 0.3
      P s u m ( x i ) P_{sum}(x_i) 0.3 0.7 1
    4. P s u m ( x i ) 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] 中选出一个随机数 r r r r 在哪个区间中,此区间对应的样本则成为一个聚类中心

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

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

  • ISOData

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

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

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

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

  • K-Means 与 KNN 比较

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

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

猜你喜欢

转载自blog.csdn.net/weixin_37352167/article/details/84975955