聚类
常见的无监督学习任务有密度估计、异常检测、聚类等,本问主要记录聚类算法及相关知识。
在无监督学习中,训练样本的标记信息是未知的,训练的过程就是要找出数据中的内在性质和规律。
聚类既可作为一个单独的过程,也能够作为其他学习任务的前驱过程,如分类,由于事先不知道样本的类别,我们可以先对样本进行聚类,根据聚类结果将每个簇(类)定义为一个类别,然后再基于这些类别训练分类模型,来判别新的样本。
聚类的两个基本问题:性能度量 和 距离计算
1.性能度量
聚类的目的是把相似的样本聚到一起,而将不相似的样本分开,类似于“物以类聚”,很直观的想法是同一个簇中的相似度要尽可能高,而簇与簇之间的相似度要尽可能的低。
性能度量大概可分为两类: 一是外部指标, 而是内部指标
a:外部指标将聚类结果和某个“参考模型”进行比较,
b:内部指标不利用任何参考模型,直接考察聚类结果。
性能指标公式可参考西瓜书
2.距离计算
距离度量常用 闵可夫斯基距离, 适用于有序属性(别的属性有离散属性)
公式中当p=1时,即曼哈顿距离;
当p=2时,即欧式距离(街区距离);
对于无序属性,可用VDM(value difference metric)公式
几种聚类算法:
1.K-Means聚类
算法伪代码:
输入:样本集D={x1, x2, x3,…,xm},聚类簇数k
输出:簇划分C={C1,C2,…,Ck}
从D中随机选取k个样本作为初始向量;
repeat:
初始化所有Ci为空集;
对于样本集里每个样本x:
计算x与k个初始向量的距离,选择距离最小的初始向量的簇标记j作为x的簇标记,将x加入Cj中;
对于每个簇:
计算新的均值向量,如果新的均值向量与上一步的不同,则更新;否则保持当前均值向量 不变;
until 当前均值向量均未更新;
2.高斯混合聚类(未看)
3.密度聚类
密度聚类从样本密度的角度来考察样本之间的可连接性,基于可连接样本不断扩展类簇以获得最终的聚类结果;用一组邻域参数(d,minPts)来刻画样本分布的紧密程度;
密度聚类涉及几个重要概念,领域、核心对象、密度直达、密度可达,密度相连;
伪代码:
输入:样本集D, 邻域参数(d, minPts)
输出:簇划分C={C1,C2,…,Ck}
初始核心对象集合A为空集;
对于样本集中每个样本x:
确定样本x的邻域,如果邻域中样本个数大于等于minPts,则将x加入A;
初始化聚类个数k=0;
初始化未访问样本集合B=D;
while A 不为空,do:
记录当前未访问样本集合 Bold= B;#Bold记录的是处理当前核心对象前未访问的集合,B记录的是处理完当前核心对象后剩下的未访问集合;
从A中随机选一个核心对象y,初始化队列Q=[y];
B = B - y;
while Q 不为空,do:
取出Q中队首样本q;如果q的邻域中样本个数大于等于minPts,则求其邻域与B的交集 I,并加入队列Q中;B = B - I;
k = k+1; 生成簇Ck=Bold-B;
A = A-Ck;
4.层次聚类
层次聚类试图在不同的层次对数据集进行划分,从而形成树形的聚类结构;可分为“自顶向下”和“自底向上”两种策略;在层次聚类中,关键是如何度量两个簇的距离,由于簇是一个集合,因此要采用关于集合的某种距离;
两个集合的最小距离,定义为两个集合中最近的样本点的距离;
两个集合的最大距离,定义为两个集合中最远的样本点的距离;
平均距离,则是两个集合中所有样本对的距离的平均值;
算法伪代码:
输入:样本集D,有m个样本;距离度量函数d;聚类簇数k;
输出:簇划分C={C1,C2,…,Ck}
对于D中每个样本Xi:
Ci = {Xi}
初始化每两个簇之间的距离矩阵;#是一个对称矩阵
初始化当前聚类个数q=m;
while q > m, do
找出距离最近的两个聚类簇Ci*和Cj*;合并Ci*和Cj*,Ci*=Ci*UCj*;
将从j*+1到q的簇的编号都减1;
删除矩阵中第j*行和j*列;
for j = 1,2,…,q-1:
更新Ci*和Cj的距离
q = q - 1