聚类算法
参考:《统计学习方法》
相似度与距离
对于聚类算法来说,定义相似度与距离是十分关键的。
Minkowski distance
设 $x_{i},x_{j}$ 是样本集合 $X$ 中的样本,$m$ 为特征数量,满足 $x_{i}=(x_{1i},x_{2i},....x_{mi})^T$
则 $x_{i}$ 与 $x_{j}$ 的 Minkowski 距离定义为:
$d_{ij}=(\sum_{k=1}^{m}|x_{ki}-x_{kj}|^p)^{\frac{1}{p}}$
$p=2$ 时为欧氏距离。
$p=1$ 时为曼哈顿距离。
$p=\infty$ 时为 $d_{ij} = \max_{k} |x_{ki}-x_{kj}|$
马氏距离
相关系数
绝对值越接近于 1,样本越相似;越接近于 0,表示样本越不相似。
$r_{ij}=\frac{\sum_{k=1}^{m} (x_{ki}-\bar{x_{i}})(x_{kj}-\bar{x_{j}}) }{[\sum_{k=1}^{m}(x_{ki}-\bar{x_{i}})^2\sum_{k=1}^{m}(x_{kj}-\bar{x_{j}})^2]^{\frac{1}{2}}}$
其中 $\bar{x_{i}} = \frac{1}{m} \sum_{k=1}^{m} x_{ki}$
聚合聚类算法
输入:$n$ 个样本组成的样本集合以及样本之间的距离。
输出:对样本集合的一个层次化聚类。
(1)计算出 $n$ 个样本两两之间的距离 $d_{ij}$
(2)构造 $n$ 个类,每个类里面只有一个样本。
(3)合并类间距离最小的两个类(这里以最短距离为类间距离),构建一个新类。
(4)计算新类与其余各类之间的距离并回到第(3)步。若类的个数为 1 则终止计算。
时间复杂度为 $O(n^3m)$,$n$ 为样本个数,$m$ 为样本维数。
将层次聚类的过程画出会是一个树形结构(二叉树)
K-means 聚类算法
理论上来说,$K-means$ 聚类算法皆在求解最优化问题:
$C^{*} = \mathop{\arg\min}_{C} \sum_{l=1}^{K} \sum_{C(i)=l}||x_{i}-\bar{x_{l}}||^2$
然而该问题是 NP 完全问题,所以无法完全准确求出最优解。
目的是将数据分为 $K$ 个类别,方法非常简单,收敛速度也很快。
第一步:随机选 $K$ 个样本点作为起始聚类中心。
第二步:对于每个样本,计算距离哪个聚类中心最近,并归为该聚类。
第三步:对于第二步中算好的聚类,去其质心作为新的聚类中心,并回到第二步。
如果发现下一次计算出的聚类中心距离前一次偏移不大的话就停止算法。
时间复杂度为 $O(nmk)$
特点:
(1)得到的聚类是平坦的,非层次化的。
(2)算法是迭代算法,并不能保证得到全局最优解。
(3)算法的收敛性与初始点的选取关系很大。
(4)由于初始样本点的选择很重要,故可以用层次聚类对样本进行聚类,得到 $K$ 个类时停止。然后从每个类中选择一个与中心距离最近的点。
(5)一般来说,可以用类的平均直径来衡量聚类优良。而 $K$ 变大,直径往往会变大,最终收敛。故可以二分出直径小的最小的 $K$