zoukankan      html  css  js  c++  java
  • 30(1).原型聚类---k-means

    原型聚类prototype-based clustering假设聚类结构能通过一组原型刻画。

    常见的原型聚类有:

    1. k均值算法k-means
    2. 学习向量量化算法Learning Vector Quantization:LVQ
    3. 高斯混合聚类Mixture-of-Gaussian

    一、k-means算法

    1.k-means

    1.1 给定样本集$D={X_1,X_2,...,X_N }$,假设一个划分为$C={C_1,C_2,...,C_K}$,定义该划分的平方误差为:

    $err=sum_{k=1}^K sum_{x=1,X_i in C_k} ||X_i - u_k||_2^2$,其中$u_k = frac{1}{|C_k|} sum_{X_i in C_k}X_i$是簇$C_k$的均值向量。

    $err$刻画了簇类样本围绕簇均值向量的紧密程度,其值越小,则簇内样本相似度越高。

    k-means算法的优化目标为:最小化$err$。即:$min_C sum_{k=1}^K sum_{X_i in C_k} ||X_i - u_k||_2^2$

    1.2 k-means的优化目标需要考察$D$的所有可能的划分,这是一个NP难的问题。实际上k-means采用贪心策略,通过迭代优化来近似分解。

    1. 首先假设一组均值向量。
    2. 然后根据假设的均值向量给出了$D$的一个划分。
    3. 再根据这个划分来计算真实的均值向量:
      1. 如果真实的均值向量等于假设的均值向量,则说明假设正确。根据假设均值向量给出的$D$的一个划分确实是原问题的解。
      2. 如果真实的均值向量不等于假设的均值向量,则可以将真实的均值向量作为新的假设均值向量,继续迭代求解。

    1.3 给定一组假设的均值向量,如何计算出$D$的一个簇划分?

    k-means算法的策略是:样本离哪个簇的均值向量最近,则该样本就划归到那个簇。

    1.4 k-means算法:

    输入:样本集$D={X_1,X_2,...,X_N }$,聚类簇数$K$

    输出:簇划分$C={C_1,C_2,...,C_K }$

    算法步骤:

    1. 从$D$中随机选择$K$个样本作为初始均值向量${u_1,u_2,...,u_K }$
    2. 重复迭代直到算法收敛,迭代过程:
      1. 初始化阶段:取$C_k = varnothing,k=1,2,...,K$
      2. 划分阶段:令$i=1,2,...,N$:
        1. 计算$X_i$的簇标记:$lambda_{i}=arg min _{k}left|overrightarrow{{x}}_{i}-vec{mu}_{k} ight|_{2}, k in{1,2, cdots, K}$,即:将$X_i$离哪个簇的均值向量最近,则该样本就标记为那个簇
        2. 然后将样本$X_i$划入相应的簇:$C_{lambda_i}=C_{lambda_i} cup {X_i}$
      3. 重计算阶段:计算$hat{vec{mu}}_{k}: hat{vec{mu}}_{k}=frac{1}{left|{C}_{k} ight|} sum_{vec{x}_{i} in mathbb{C}_{k}} overrightarrow{{x}}_{i}$
      4. 终止条件判断:
        1. 如果对所有的$k in {1,2,...,K}$,都有$hat{u_k}=u_k$,则算法收敛,终止迭代
        2. 否则重赋值$u_k=hat{u_k}$

    1.5 k-means优点:

    1. 计算复杂度低,为$O(NKq)$,其中$q$为迭代次数。通常$K$和$q$要远远小于$N$,此时复杂度相当于$O(N)$
    2. 思想简单,容易实现。

    1.6 k-means缺点:

    1. 需要确定聚类的数量K
    2. 分类结构严重依赖于分类中心的初始化。通常进行多次k-means,然后选择最优的那次作为最终聚类结构。
    3. 结果不一定是全局最优的,只能保证局部最优。
    4. 对噪声敏感。因为簇的中心是取平均,因此聚类簇很远地方的噪音会导致簇的中心点偏移。
    5. 无法解决不规则形状的聚类。
    6. 无法处理离散特征,如:国籍、性别等。

    1.7 k-means性质:

    1. k-means实际上假设数据是呈现球形分布,实际任务中很少有这种情况。与之相比,GMM使用更加一般的数据表示,即高斯分布。
    2. k-means假设各个簇的先验概率相同,但是各个簇的数据量可能不均匀。
    3. k-means使用欧式距离来衡量样本与各个簇的相似度。这种距离实际上假设数据的各个维度对于相似度的作用是相同的。
    4. k-means中,各个样本点只属于与其相似度最高的那个簇,这实际上是分簇。
    5. k-means算法的迭代过程实际上等价于EM算法。

    2.k-means++

    2.1 k-means++属于k-means的变种,它主要解决k-means严重依赖于分类中心初始化的问题

    2.2 k-means++选择初始均值向量时,尽量安排这些初始均值向量之间的距离尽可能的远。

    2.3 k-means++算法:

    输入:样本集$D={X_1,X_2,...,X_N}$,聚类簇数$K$

    输出:簇划分$C={C_1,C_2,...,C_K}$

    算法步骤:

    1. 从$D$中随机选择1个样本作为初始均值向量组${u_1}$
    2. 迭代,直到初始均值向量组有$K$个向量。假设初始均值向量组为${u_1,...,u_m}$。迭代过程如下:
      1. 对每个样本$X_i$,分别计算其距$u_1,...,u_m$的距离。这些距离的最小值记作$d_i=min_{u_j}||X_i-u_j||$
      2. 对样本$X_i$,其设置为初始均值向量的概率正比于$d_i$。即:离所有的初始均值向量越远,则越可能被选中为下一个初始均值向量。
      3. 以概率分布$P={d_1,d_2,...,d_N}$(未归一化的)随机挑选一个样本作为下一个初始均值向量$u_{m+1}$
    3. 一旦挑选出初始均值向量组${u_1,...,u_K}$,剩下的迭代步骤与k-means相同。

    3.k-modes

    3.1 k-modes属于k-means的变种,它主要解决k-means无法处理离散特征的问题。

    3.2 k-modes与k-means有两个不同点(假设所有特征都是离散特征):

    1. 距离函数不同。在k-modes算法中,距离函数为:$distance(X_i,X_j)=sum_{d=1}^n I(x_{i,d}=x_{j,d})$,其中$I(cdot)$为示性函数。上式的意义为:样本之间的距离等于他们之间不同属性值的个数。
    2. 簇中心的更新规则不同。在k-modes算法中,簇中心每个属性的取值为:簇内该属性出现频率最大的那个值$hat{mu}_{k, d}=arg max _{v} sum_{vec{x}_{i} in mathbb{C}_{k}} Ileft(x_{i, d}=v ight)$,其中$v$的取值空间为所有样本在第$d$个属性上的取值。

    4.k-medoids

    4.1 k-medoids属于k-means的变种,它主要解决k-means对噪声敏感的问题

    4.2 k-medoids算法:

    输入:样本集$D={X_1,X_2,...,X_N}$,聚类簇数$K$

    输出:簇划分$C={C_1,C_2,...,C_K}$

    算法步骤:

    1. 从$D$中随机选择$K$个样本作为初始均值向量${u_1,u_2,...,u_K}$
    2. 重复迭代直到算法收敛,迭代过程:
      1. 初始化阶段:取$C_k=oslash,k=1,2,...,K$。遍历每个样本$X_i,i=1,2,...,N$,计算它的簇标记:$lambda_i=arg min_k ||X_i-u_k||_2,k in {1,2,...,K}$。即:将$X_i$离哪个簇的均值向量最近,则该样本就标记为那个簇。然后将样本$X_i$划入相应的簇:$C_{lambda_i}=C_{lambda_i} cup  {X_i}$
      2. 重计算阶段:遍历每个簇$C_k,k=1,2,...,K$:
        1. 计算簇新$u_k$距离簇内其他点的距离$d_u^{(k)}=sum_{X_j^{(k)} in C_k} ||u_k - X_j^{(k)}||$
        2. 计算簇$C_k$内每个点$X_i^{(k)}$距离簇内其他点的距离$d_i^{(k)}=sum_{X_j^{(k)}} ||X_i^{(k)} - X_j^{(k)}||$。如果$d_i^{(k)} < d_u^{(k)}$,则重新设置簇中心:$u_k=X_i^{(k)}$,$d_u^{(k)}=d_i^{(k)}$
      3. 终止条件判断:遍历一轮簇$C_1,...,C_K$之后,簇心保持不变

    4.3 k-medoids 算法在计算新的簇心时,不再通过簇内样本的均值来实现,而是挑选簇内距离其它所有点都最近的样本来实现。这就减少了孤立噪声带来的影响。

    4.4 k-medoids 算法复杂度较高,为$O(N^2)$ 。其中计算代价最高的是计算每个簇内每对样本之间的距离。 通常会在算法开始时计算一次,然后将结果缓存起来,以便后续重复使用。

    5.mini-batch k-means

    5.1 mini-batch k-means 属于 k-means 的变种,它主要用于减少k-means 的计算时间

    5.2 mini-batch k-means 算法每次训练时随机抽取小批量的数据,然后用这个小批量数据训练。这种做法减少了k-means 的收敛时间,其效果略差于标准算法。

    5.3  mini-batch k-means算法:

    输入:样本数$D={X_1,X_2,...,X_N}$,聚类簇数$K$

    输出:簇划分$C={C_1,C_2,...,C_K}$

    算法步骤:

    1. 从$D$中随机选择$K$个样本作为初始均值向量${u_1,u_2,...,u_K }$
    2. 重复迭代直到算法收敛,迭代过程:
      1. 初始化阶段:取$C_k = varnothing,k=1,2,...,K$
      2. 划分阶段:随机挑选一个Batch的样本集合$B=X_{b1},...,X_{b_M}$,其中,$M$为批大小
        1. 计算$X_i,i=b_1,...,b_M$的簇标记:$lambda_{i}=arg min _{k}left|{x}_{i}-vec{mu}_{k} ight|_{2}, k in{1,2, cdots, K}$,即:将$X_i$离哪个簇的均值向量最近,则该样本就标记为那个簇
        2. 然后将样本$X_i,i=b_1,...,b_M$划入相应的簇:$C_{lambda_i}=C_{lambda_i} cup {X_i}$
      3. 重计算阶段:计算$hat{vec{mu}}_{k}: hat{vec{mu}}_{k}=frac{1}{left|{C}_{k} ight|} sum_{vec{x}_{i} in mathbb{C}_{k}} overrightarrow{{x}}_{i}$
      4. 终止条件判断:
        1. 如果对所有的$k in {1,2,...,K}$,都有$hat{u_k}=u_k$,则算法收敛,终止迭代
        2. 否则重赋值$u_k=hat{u_k}$
  • 相关阅读:
    Codeforces Round #124 (Div. 2)
    Codeforces Round #158 (Div. 2)
    Codeforces round FF
    缕缕,
    拉伸 原来 就这一句话,
    tableveiw上面 的手势,
    reloaddata 是没有对 tableview的 headerview进行 刷新的,
    y
    考虑欠缺 以及 设计 导致的 工作量,
    present出来的 controller上的 controller里面用 navigationcontrolle了,失效了,
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/11915779.html
Copyright © 2011-2022 走看看