系列文章目录及链接
上篇:机器学习(五) -- 监督学习(7) --SVM2
下篇:机器学习(五) -- 无监督学习(1) --聚类2
前言
tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“
文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。
本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。
由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!
文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。
一、通俗理解及定义
1、什么叫聚类(What)
聚类(clustering):数据没有标签,将相似的样本自动分为一类(子集,簇,cluster)。
有监督VS无监督
2、聚类的目的(Why)
通过迭代的方式,将数据划分为K个不同的簇,并使得每个数据点与其所属簇的质心(聚类中心、中心点、均值点)之间的距离之和最小。
聚类方法:
基于划分(距离):K-means
基于层次:BIRCH (Balanced Iterative Reducing and Clustering using Hierarchies)
基于密度:DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
基于网格:Statistical Information Grid(STING)算法
基于模型:统计和神经网络方法
3、怎么做(How)
K-means:
首先要知道将数据划分成多少类别
- 随机设置K个特征空间内的点作为初始的聚类中心
- 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
- 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
- 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
聚类的结果是簇,评价方式是簇(类)内距离和簇(类)间距离,簇内距离越小越好,簇间距离越大越好
二、原理理解及公式
1、基本概念
聚类任务:根据某种相似性,把一组数据划分成若干个簇的过程。
问题:
- 相似性怎么定义!-------二、1.3、相似性度量
- 可能存在的划分!-------二、1.4、第二类Stirling数
- 若干个簇=有多少个簇?------(其中之一:二、2.3.1、“肘”方法 (Elbow method) — K值确定)
1.1、簇
簇:分组后每个组称为一个簇,每个簇的样本对应一个潜在的类别。样本没有类别标签,因此是聚类一种典型的无监督学习方法。
簇的条件:相同簇的样本之间距离较近;不同簇的样本之间距离较远。
明显分离的簇:每个点到同簇中任意点的距离比到不同簇中所有点的距离更近。
基于中心的簇:每个点到其簇中心的距离比到任何其他簇中心的距离更近。
基于邻近的簇:每个点到该簇中至少一个点的距离比到不同簇中任意点的距离更近。
基于密度的簇:簇是被低密度区域分开的高密度区域。
概念簇:簇中的点具有由整个点集导出的某种一般共同性质。(在两个环相交处的点属于两个环)
1.2、质心
机器学习中“质心”:所有数据的均值u通常被称为这个簇的“质心”(x求均值,y求均值,得到的这个点)
1.3、相似性度量
1.3.1、距离
距离度量具体可看:机器学习(五) -- 监督学习(1) -- k近邻
欧式距离,公式:
曼哈顿距离,,公式:
1.3.2、余弦相似性
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。
1.3.3、Jaccord相似性
Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具 体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。
eg:
1.4、第二类Stirling数
聚类问题:可能的划分
假设我们要把 n = 4个不同的数据点放入不相同 的 k = 2 个无差别的盒子里,有几种方案?
集合的一个划分,表示将n 个不同的元素拆分成 k 个集合的方案数, 记为S(n,k)。
随着集合元素𝒏和子集个数𝒌的增加,方案数𝑆(𝑛,𝑘)呈爆炸式增长!!!
2、K-meas
2.1、理解
K-means 是我们最常用的基于距离的聚类算法,其认为两个目标的距离越近,相似度越大。
目标:最小化类内间距
K-means算法针对聚类所得簇划分最小化平方误差,平方误差刻画了簇内样本围绕均值向量的紧密程度,平方误差值越小则簇内样本相似度越高。
2.2、步骤
- 随机设置K个特征空间内的点作为初始的聚类中心
- 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
- 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
- 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
2.3、公式
对于给定数据x,以及簇的个数k:
c_i:第 i 个簇
m_i:第 i 个簇的中心
SSE随着聚类迭代,其值会越来越小,直到最后趋于稳定
(如果质心的初始值选择不好,SSE只会达到一个不怎么好的局部最优解。)
2.3.1、“肘”方法 (Elbow method) — K值确定
- 对于n个点的数据集,迭代计算 k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和;
- 平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。
- 在这个平方和变化过程中,会出现一个拐点也即“肘”点,下降率突然变缓时即认为是最佳的k值。
在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别。
2.3.2、轮廓系数法(Silhouette Coefficient)
K-means性能指标评估--轮廓系数【机器学习(四) -- 模型评估(4)】
公式:S的范围在[-1,1],越大越好
a:样本 i 到同一簇内其他点不相似程度的平均值
b:样本 i 到其他簇的平均不相似程度的最小值
对于每一个样本
1、计算蓝1到自身类别的点距离的平均值a
2、计算蓝1分别到红色类别,绿色类别所有的点的距离,求出平均值b1, b2,取其中最小的值当做b
b>>a: 1完美
a>>b:-1最差
如果s小于0,说明a 的平均距离大于最近的其他簇。聚类效果不好
如果s越大,说明a的平均距离小于最近的其他簇。聚类效果好
轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优
超过0.1,说明聚类效果很好
轮廓系数API
sklearn.metrics.silhouette_score
导入:
from sklearn.metrics import silhouette_score
语法:
silhouette_score(X, labels)
X:特征值
labels:被聚类标记的目标值
2.4、eg:
step1:随机设置3个初始聚类中心
step2:每一个点根据到每个聚类中心的距离分类
step3:重新计算每个新的聚类中心
step4:重复2、3步(如下3个点被重新分配),直到,聚类中心不在变化
2.5、K-means++
2.5.1、理解
K-means算法得到的聚类结果严重依赖与初始簇中心的选择,如果初始簇中心选择不好,就会陷入局部最优解,因此提出了K-means++算法,它改进了K-means算法初始中心点的选取。
核心思想是:再选择一个新的聚类中心时,距离已有聚类中心越远的点,被选取作为聚类中心的概率越大。
2.5.2、步骤
- 从数据集中随机选择第一个质心。
- 对于每个数据点x,计算其到已选择的所有质心的最短距离D(x)。
- 选择一个新的数据点作为下一个质心,选择的概率与D(x)成正比,即概率P(x) = D(x) / ΣD(x)。
- 重复步骤2和3,直到选择了K个质心。
这种选择策略确保了质心之间的分散性,从而提高了聚类效果。
2.5.3、eg:
3、K-Medoids(k-中心)
3.1、理解
k-中心和k-均值很像,不同的是形心的更新选择,k-均值是通过求得均值进行更新形心的,而k-中心是随机选择k个对象作为初始的k个簇的代表点,反复用非代表点来代替代表点,直到找到误差平方和最小的那个点来作为数据中心点。这样划分方法是基于最小化所有对象与其参照点之间的相异度之和的原则来执行的,这是 k-medoids 方法的基础。
3.2、步骤
- 随机选择 k 个数据点作为初始聚类中心
- 将每个剩余的数据点分配在临近的聚类中心的类中当中去
- 每个类中计算每个数据点为聚类中心时的代价函数的值,选取最小值成为新的聚类中心
- 重复2、3过程,直到所有的聚类中心不再发生变化,或达到设定的最大迭代次数
4、层次聚类
4.1、理解
把每一个单个的观测都视为一个类,而后计算各类之间的距离,选取最相近的两个类,将它们合并为一个类。新的这些类再继续计算距离,合并到最近的两个类。如此往复,最后就只有一个类。然后用树状图记录这个过程,这个树状图就包含了我们所需要的信息。
4.2、方法:
- 凝聚的层次聚类:AGNES算法 (AGglomerative NESting)
- 分裂的层次聚类:DIANA算法 (DIvisive ANALysis)
- 层次聚类优化算法:CF-Tree(Cluster Feature Tree)、BIRCH算法 (平衡迭代削减聚类法)、CURE算法(使用代表点的聚类法)
4.2.1、AGNES
采用自底向上的策略。
凝聚型层次聚类有多种变体,这些变体主要基于不同的距离度量方法和链结标准来定义。以下是一些常见的变体:(AGNES算法中簇间距离:)
最近邻链结(SL聚类)
两个聚簇中最近的两个样本之间的距离(single-linkage聚类法);
最终得到模型容易形成链式结构。
最远邻链结(CL聚类)
两个聚簇中最远的两个样本的距离(complete-linkage聚类法);
如果存在异常值,那么构建可能不太稳定。
平均链结(AL聚类)
两个聚簇中样本间两两距离的平均值(average-linkage聚类法);
两个聚簇中样本间两两距离的中值(median-linkage聚类法);
Ward链结(WL聚类)
两个聚簇中样本合并后产生的方差增加值被用作这两个聚类之间的距离。
4.3、eg:
一组数据D={a,b,c,d,e},它们之间的距离矩阵为:
step1:每个样本都是一个类
step2:将最近的两个类合并为一个新的类,并重新计算类之间的距离然后更新距离矩阵:
step3:重复:选择距离最近的两个类合并为新的类:
step4:不断重复上述两个步骤,最终只剩下一个类的时候,停止:
5、密度聚类
5.1、理解
密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。
通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。
核心思想是:在数据空间中找到分散开的密集区域,简单来说就是画圈,其中要定义两个参数,一个是圈的最大半径,一个是一个圈里面最少应该容纳多少个点。
5.2、方法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)
5.3、eg:
step1:设定参数密度阈值N=3,也就是每个圈里必须满足3个点,才能称为一个簇,首先我们随机选取一些候选的核心点:
这些灰色点为核心点的候选:
step2:以这些候选的核心点为圆心按照设定的半径画圆圈:
step3:如果圈内满足三个点,那就是一个簇,簇内点候选的核心点就是核心点:这些红色的点就是核心点,而灰色的点因为其圈内点数不满足阈值,所以不是核心点:
step4:合并重合的簇:
6、网格聚类
6.1、理解
将数据空间划分为网格单元,将数据对象映射到网格单元中,并计算每个单元的密度。根据预设阈值来判断每个网格单元是不是高密度单元,由邻近的稠密单元组成“类”。
6.2、方法
- CLIQUE (Clustering in QUEst)
- STING (Statistical Information Grid 统计信息网格)
- MAFIA (Merging of adaptive interval approach to spatial datamining 空间数据挖掘的自适应区间方法的合并)
- Wave Cluster (小波聚类)
- O-CLUSTER (orthogonal partitioning CLUSTERing 正交分区聚类)
- Axis Shifted Grid ClusteringAlgorithm(轴移动网格聚类算法)
- Adaptive Mesh Refinement (自适应网格细化)
6.3、步骤
- 将数据空间划分为有限数量的单元格;
- 随机选择一个单元格“𝑐”,𝑐不应该事先遍历;
- 计算“𝑐”的密度;
- 如果“𝑐”的密度大于阈值的密度:
- 将单元格“c”标记为新的聚类(cluster);
- 计算“c”所有邻居的密度;
- 如果相邻单元的密度大于阈值密度,将其添加到集群中,并且重复步骤4.2和4.3直到没有相邻单元的密度大于阈值密度
- 重复步骤2,3,4,直到遍历所有单元格
6.4、eg:
step1:选择一定宽度的格子来分割数据空间
step2:设置阈值为2,将相邻稠密的格子合并形成一个“类”
7、优缺点
7.1、K-means优缺点
7.1.1、优点:
- 属于无监督学习,无须准备训练集
- 原理简单,实现起来较为容易
- 结果可解释性较好
7.1.2、缺点:
- 需手动设置k值。 在算法开始预测之前,我们需要手动设置k值,即估计数据大概的类别个数,不合理的k值会使结果缺乏解释性
- 可能收敛到局部最小值, 在大规模数据集上收敛较慢
- 对于异常点、离群点敏感
- 非凸形状无法聚类
7.2、K-means++优点
- 减少局部最优解的风险:更大概率选择相距较远的初始质心,提高聚类质量。
- 理论保证:K-means++能够给出接近最优解的界。
- 效率:虽然初始化复杂度有所增加,但整体算法依然保持高效,尤其是对于大规模数据集。
7.3、K-Medoids优缺点
7.3.1、优势:
- 噪声鲁棒性比较好。(当存在噪音和孤立点时,比K-means效果好)
7.3.2、缺点:
- 运行速度较慢,计算质心的步骤时间复杂度是O(n^2)
- K-medoids 对于小数据集工作得很好, 但不能很好地用于大数据集
7.4、层次聚类优缺点
7.4.1、优点:
- 距离和规则的相似度容易定义,限制少
- 不需要预先制定聚类数
- 可以发现类的层次关系
7.4.2、缺点:
- 计算复杂度太高;
- 异常值也能产生很大影响;
- 算法很可能聚类成链状
7.5、密度聚类优缺点
7.5.1、优点:
- 不需要指定簇的个数;
- 可以对任意形状的稠密数据集进行聚类。相对的,K-Means之类的聚类算法一般只适用于凸数据集;
- 擅长找到离群点(检测任务);
- 只有两个参数𝜀和MinPts
- 聚类结果没有偏倚。K-Means之类的聚类算法初始值对聚类结果有很大影响。
7.5.2、缺点:
- 高维数据有些困难;
- Sklearn中效率很慢(数据削减策略);
- 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,用DBSCAN聚类一般不适合;
- 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值𝜀,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。
7.6、网格聚类优缺点
7.6.1、优点:
- 网格聚类算法相对简单,易于实现和理解;
- 网格聚类算法可以有效地处理大规模数据,因为它可以通过网格结构将数据划分为多个小区域,从而减少计算量;
- 网格聚类算法可以自适应地调整簇的数量和大小,从而更好地适应不同的数据分布;
7.6.2、缺点:
- 网格聚类算法对于数据的形状和密度比较敏感,如果数据分布比较复杂或者存在噪声,可能会导致聚类效果不佳;
- 网格聚类算法需要手动设置一些参数,如网格大小、邻域半径等,这些参数的选择可能会影响聚类效果;
- 网格聚类算法可能会产生重叠的簇,这些簇的边界可能比较模糊,难以解释;
旧梦可以重温,且看:机器学习(五) -- 监督学习(7) --SVM2
欲知后事如何,且看:机器学习(五) -- 无监督学习(1) --聚类2