层次聚类
层次聚类假设类别之间存在层次结构,将样本聚到层次化的类中。分为聚合(agglomerative)聚类(自下而上)、分裂(divisive)聚类(自上而下),每个样本只属于一个类,所以层次聚类属于硬聚类。
聚合聚类算法:
输入:nnn个样本组成的样本集合及样本之间的距离;
输出:对样本集合的一个层次化聚类。
- 计算nnn个样本两两之间的欧氏距离{dij}\{d_{ij}\}{dij},记作矩阵D=[dij]n∗nD={[d_{ij}]}_{n*n}D=[dij]n∗n。
- 构造nnn个类,每个类只包含一个样本。
- 合并类间距离最小的两个类,其中最短距离为类间距离,构建一个新类。
- 计算新类与当前各类的距离。若类的个数为1,终止计算,否则回到步3。
算法复杂度O(n3m)O(n^3m)O(n3m),其中mmm是样本的维数,nnn是样本个数。
KKK均值聚类
KKK均值聚类是基于样本集合划分的聚类算法。KKK均值聚类将样本集合划分为KKK个子集,构成KKK个类,将nnn个样本分到KKK个类中,每个样本到其所属类的中心的距离最小。每个样本只属于一个类,因此KKK聚类也是硬聚类。
算法:
输入:nnn个样本的集合XXX。
输出:样本集合的聚类CCC。
- 初始化。令t=0t=0t=0,随机选择KKK个样本点作为初始聚类中心m(0)=(m1(0),...,ml(0),...,mk(0))m^{(0)}=(m_1^{(0)},...,m_l^{(0)},...,m_k^{(0)})m(0)=(m1(0),...,ml(0),...,mk(0))。
- 对样本进行聚类。对固定的类中心m(t)=(m1(t),...,ml(t),...,mk(t))m^{(t)}=(m_1^{(t)},...,m_l^{(t)},...,m_k^{(t)})m(t)=(m1(t),...,ml(t),...,mk(t)),其中ml(t)m_l^{(t)}ml(t)是类GlG_lGl的中心,计算每个样本到类中心的距离,将每个样本指派到与其最近的中心的类中,构成聚类结果C(t)C^{(t)}C(t)。
- 计算新的类中心,对聚类结果C(t)C^{(t)}C(t),计算当前各个类中的样本的均值,作为新的类中心m(t+1)=(m1(t+1),...,ml(t+1),...,mk(t+1))m^{(t+1)}=(m_1^{(t+1)},...,m_l^{(t+1)},...,m_k^{(t+1)})m(t+1)=(m1(t+1),...,ml(t+1),...,mk(t+1))。
- 如果迭代收敛或符合停止条件,输出C∗=C(t)C^*=C^{(t)}C∗=C(t),否则,令t=t+1t=t+1t=t+1,返回步2。
算法复杂度O(mnk)O(mnk)O(mnk),其中mmm是样本维数,nnn是样本个数,kkk是类别个数。