机器学习——聚类
【金山文档 | WPS云文档】 机器学习聚类
https://kdocs.cn/l/cdi0C3jiXQ6Z
很多图没显示,懒的弄了,文章内容挺多的,参考学习了6-8篇文档,整理到word里,很多没来得及留下出处,主要是以学习为主,分享学习内容,请多包涵
聚类
定义属于无监督学习,不需要标记原始数据,根据数据的固有的结构特征进行聚集。从而形成簇群,并实现数据的分离。
◆聚类和分类的主要区别
聚类不关心数据属于哪种类别,而是把具有相类似特征的数据聚集起来形成某一类别的簇。
◆聚类过程
首先选择有效的特征来构成特征向量,然后根据欧氏距离或其他距离函数来计算其相似度,从而实现对类别的划分,通过对聚类结果进行评估,逐步迭代并生成新的聚类。
聚类的应用领域
◆可用于发现不同公司客户群体的特征,消费者行为分析,市场细分,交易数据分析,动植物种群分类,医疗领域的疾病诊断,环境质量检测等领域,也可以用于Internet领域和电子商务领域中客户分析以及行为特征分类分析等
◆在数据分析的过程中,可以首先使用聚类来探索数据并发现其中包含的类别特征,然后使用分类等算法对每个类别的特征进行分析
聚类方法分类
◆基于层次的聚类:
将数据集划分为不同的层次,并使用合并或者分解的操作进行聚类,主要包括
BIRCH(BalancedIterativeReducingandClusteringusingHierarchies)
CURE(ClusteringUsingRepresentatives)等。
◆基于划分的聚类:
将数据集划分为k个簇,然后计算其中的样本距离以获得假设簇的中心点,之后使用簇的中心点重新迭代计算新的中心点,直到k个簇的中心点收敛为止。
基于划分的聚类有k-均值(k-means)等
◆基于密度的聚类
根据样本的密度不断增长聚类,最终形成一组“密集连接”的点集。
核心思想:
只要数据的密度大于阈值,就可以将数据合并到一个簇当中,可以对噪声进行过滤,聚类的结果可以是任何形状的,不一定是凸形。
主要方法:
DBSCAN(Density-BasedSpatialClusteringofApplicationwithNoise)、OPTICS(OrderingPointsToIdentifytheClusteringStructure)等。
BIRCH算法
使用层次方法来平衡迭代规则和聚类,它只需要扫描一次数据集即可实现聚类,它使用了类似于B+树的结构来划分样本数据集,叶节节点之间使用双向链表连接起来,逐步优化树的结构以获得聚类。
CF(Clustering Feature)树
数据点
在BIRCH算法中,每一个数据点用一个CF(Clustering Feature)向量来表示。一个CF向量通常由以下三个部分组成:
(N): 数据点的数量。
(LS): 线性和(Linear Sum),即所有数据点的矢量和。
(SS): 平方和(Square Sum),即所有数据点的平方的矢量和。
簇
簇是一组相似的数据点的集合。在BIRCH算法中,每一个簇用一个CF向量进行描述。这个CF向量是簇中所有数据点的CF向量的和。
簇的合并和分裂
当一个新的数据点加入CF树时,会寻找距离最近的簇并尝试合并。如果合并后的簇满足一定的条件(例如,半径不超过某一阈值),则合并成功。否则,簇将分裂为两个或多个小簇。
BIRCH的时间复杂度和空间复杂度
BIRCH算法的一个主要优点是其高效性。通常情况下,BIRCH算法的时间复杂度为(O(n)),其中(n)是数据点的数量。这主要得益于CF树结构,它允许算法只扫描数据集一次或几次。
同样地,由于数据点被压缩存储在CF树中,因此BIRCH算法也有很好的空间复杂度。理论上,其空间复杂度可以达到(O(n1/2))。
BIRCH vs K-means和其他聚类算法
优点:
高效性:如前所述,BIRCH算法通常只需要一次或几次数据扫描。
可扩展性:由于使用了CF树结构,BIRCH算法能有效地处理大规模数据集。
层次结构:不同于K-means的扁平聚类,BIRCH提供了一种层次聚类结构,这在某些应用场景中可能更有用。
局限性和缺点
球形假设:BIRCH算法假设簇是球形的,这在某些情况下可能不适用。要求数据集的样本为超球体
参数敏感性:需要合适的阈值和其他参数,否则算法的效果可能会受到影响。
Python中BIRCH的实现
在 Python 中,scikit-learn 库提供了 BIRCH 的实现,可以使用 `sklearn.cluster.Birch` 类来进行聚类。该类的主要参数包括:
bir = Birch(n_clusters=None,threshold=tau,branching_factor=b)
·`threshold`: float, optional (default=0.5)
叶子节点的阈值,用于控制 CF 树的大小,默认值为 0.5。
·`branching_factor`: int, optional (default=50)
分支因子,用于控制 CF 树的分支度,默认值为 50。
·`n_clusters`: int or None
聚类的数量,默认为 None,表示不指定聚类的数量,而是通过阈值和分支因子来 自动确定聚类的数量。
在 `Birch` 类中,有以下常用的方法:
- `fit(X[, y])`: 对数据 X 进行聚类,并返回一个 `Birch` 对象。
- `fit_predict(X[, y])`: 对数据 X 进行聚类,并返回每个数据点的簇标签。
- `predict(X)`: 对新数据 X 进行预测,返回每个数据点的簇标签。
- `transform(X)`: 将数据 X 转换成 CF 树中的叶子节点,返回一个稀疏矩阵。
CURE算法
介绍
◆传统的基于划分聚类的方法会得到凸形的聚类,该凸形的聚类对异常数据较为敏感;
◆CURE算法使用多个代表点来代替聚类中的单个点,算法相对更为健壮。在处理大数据时使用随机采样和分区,这使得在处理大数据样本集时更加具有时效性,而且对聚类质量没有影响
CURE采用了一种新颖的层次聚类算法.该算法选择基于质心和基于代表对象方法之间的中间策略。它不同于单个质心或对象来代表一个类,而是选择数据空间中固定数目的具有代表性的点。一个类的代表点通过如下方式产生:首先选择类中分散的对象,然后根据一个特定的分数或收缩因子“收缩”或移动它们。在算法的每一步,有最近距离的代表点对(每个点来自于一个不同的类)的两个类被合并。
算法步骤
·从源数据对象中抽取一个随机样本S;
·将样本S分割成一组划分;
·对每个划分局部的聚类;
·通过随机样本剔除孤立点。如果一个类增长缓慢就去除它;
·对局部的类进行聚类,落在每个新形成的类中的代表点根据用户定义的一个收缩因子收缩或向类中心移动。这些点代表和捕捉到了类的形状。
·用相应的类标签来标记数据。
CURE 聚类特点
(1)属于凝聚层次聚类
CURE 算法首先把每个数据点看成一个簇,然后将距离最近的簇结合,一直到簇的个数 达到要求的 K 个为止。
(2)适应非球形的几何形状
不同于一个质心或者单个点来代表一个类,CURE 算法中每个簇有多个代表点,这使得 CURE算法可以适应非球形的几何形状。
代表点的选取:
首先选择簇中距离质心最远的点做为第一个点,然后依次选择距离已选到的点最远的点,直到选到c 个点为止,这些点尽量得分散,捕获了簇的形状和大小。
(3)对孤立点的处理更加健壮
通过“收缩因子”减少离群点对聚类效果的影响。
代表点的收缩或凝聚:
将上面选取到的代表点根据固定的参数α(0≤α≤1 )向该簇的质心收缩,距离质心越远的点(例如离群点)的收缩程度越大,因此CURE对离群点是不太敏感的,这种方法可以有效的降低离群点带来的不利影响。
收缩系数α的取值不同,聚类结果也相应不同。
·当 α 趋于 0 时,所有的“代表点”都汇聚到质心,算法退化为基于“质心” 的聚类;
·当 α 趋于 1 时,“代表点”完全没有收缩,算法退化为基于“全连接”的聚类,
因此 α 值需要根据数据特征灵活选取,才能得到更好的聚类结果
在得到收缩后的代表点后,两个簇之间的距离就可以定义为这两个簇中距离最近的两个 代表点之间的距离
(4)适应大规模数据
为了适应大型数据,CURE算法采用了随机抽样和分割相结合的手段。
随机抽样将原始数据集中的部分点提取出来,然后试图在这些点上实施CURE层次聚类算法,采样形成的数据子集要适应内存的需要并且与原始数据集相比要足够小。因此,这种随机采样的方法会大大提升CURE的执行速度,并且由于采样过程会对离群点进行过滤因而可以提高聚类质量。
(5)识别异常值/离群点
CURE 算法分两个阶段消除异常值的影响。
第一阶段
·第一个阶段、是在聚类算法执行到某一阶段(或称当前的簇总数减小到某个值) 时,根据簇的增长速度和簇的大小对离群点进行一次识别。将聚类过程中类成员 增长非常缓慢的类作为异常值剔除;
需要注意的是:
如果这个阶段选择的较早(簇总数过大)的话,会将一部分本应被合并的簇识 别为离群点;
如果这个阶段选择的较晚(簇总数过少)的话,离群点很可能在被识别之前就 已经合并到某些簇中;
第一阶段有一个很明显的问题,就是当随机采样到的离群点分布的比较近时(即使可能性比较小),这些点会被合并为一个簇,而导致无法将他们识别出来,这时就需要第二阶段的来进行处理。
第二阶段
是指在聚类的最后阶段,将非常小的簇删除;
由于离群点占的比重很小,而在层次聚类的最后几步中,每个正常簇的粒度都是非常高的,因此很容易将他们识别出来,一般当簇的总数缩减到大约为 k 时,进行第二阶段的识别。
优缺点
优点:
1)可以发现复杂空间的簇
2)受噪点影响小
缺点:
1)参数较多,包括采样的大小、聚类的个数、收缩的比例等;
2) 抽样有误差;
3)难以发现形状非常复杂的空间簇(如中空形状),对空间数据密度差异敏感
4)虽然 CURE 聚类是针对大规模数据库设计的算法,但是当数据量剧增时,效率仍然不能满足需求
k-均值算法
传统的k-均值算法的聚类过程
在样本集中随机选取k个聚类中心点,计算每个样本的候选中心的距离并且根据距离的大小将其分组,获得分组后,将重新计算聚类的中心,循环迭代,反复地进行计算,直到聚类的中心不再改变或者收敛
◆改进的k-means算法
初始化优化k-means算法,距离优化Elkank-Means算法,k-Prototype算法等。
算法具体步骤
第一步:指定聚类类数k(此处涉及k的选择方法);
第二步:选定初始化聚类中心。随机或指定k个对象,作为初始化聚类中心(此处随机选的方法可以升级,以达到更好的聚类效果,比如kmeans++聚类算法);
第三步:得到初始化聚类结果。计算每个对象到k个聚类中心的距离,把每个对象分配给离它最近的聚类中心所代表的类别中,全部分配完毕即得到初始化聚类结果,聚类中心连同分配给它的对象作为一类;
第四步:重新计算聚类中心。得到初始化聚类结果后,重新计算每类的类中心点(计算均值),得到新的聚类中心;
第五步:迭代循环,得到最终聚类结果。重复第三步和第四步,直到满足迭代终止条件。
k取值方法
1、如果实际业务中,数据维度不超过三维,可先通过画散点图的方法大致确定聚类数目。
2、工作中,结合业务方需求背景或经验,可敲定聚类数目。如,做用户的RFM模型(k=3)、判断是否为作弊用户(k=2)等。
3、实际业务中做探索性分析时,没有经验等做参考,可使用肘方法(elbow method)确定分类数。此处结合第一部分提到的误差平方和最小来一起理解。要使误差平方和变小,一种方法就是增加类数,这样有助于降低每个类的类内误差平方和,从而降低整体的误差平方和。但若类数太多,一是归类后解释困难,另一个降低类内误差平方和的边际效应可能下降(即增加类数k,误差平方和降低的不显著)。此时,k取误差平方和关于k的曲线的拐点。
4、交叉验证方法。将N个对象分为m个部分,用m-1个部分建立聚类模型,并用剩下的一部分检验聚类质量。
5、轮廓系数法。计算k取不同值时的轮廓系数,选择轮廓系数较接近1的分类数。
手肘法
核心公式:SSE(sum of the squared errors,误差平方和)
其中,Ci是第i个簇;x是Ci中的样本点;mi是Ci的质心(Ci中所有样本的均值);SSE是所有样本的聚类误差,代表了聚类效果的好坏。
随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。
梯度最大,下降最快
轮廓系数法
具体方法如下:
1)计算样本i到同簇其他样本的平均距离ai。ai越小,说明样本i越应该被聚类到该簇。将ai称为样本i的簇内不相似度。簇C中所有样本的均值称为簇C的簇不相似度。
2)计算样本i到其他某簇Cj的所有样本的平均距离bij,称为样本i与簇Cj的不相似度。定义为样本i的簇间不相似度:bi越大,说明样本i越不属于其他簇。
3)根据样本i的簇内不相似度ai和簇间不相似度bi,定义样本i的轮廓系数。
轮廓系数范围在[-1,1]之间。该值越大,越合理。si接近1,则说明样本i聚类合理;接近-1,则说明样本i更应该分类到另外的簇;若si近似为0,则说明样本i在两个簇的边界上。
所有样本的si的均值称为聚类结果的轮廓系数,是该聚类是否合理、有效的度量。使用轮廓系数(silhouette coefficient)来确定,选择使系数较大所对应的k值。
K-means++
我们知道初始值的选取对结果的影响很大,对初始值选择的改进是很重要的一部分。在所有的改进算法中,K-means++最有名。K-means++算法步骤如下所示:
(1)随机选取一个中心点a1;
(2)计算数据到之前n个聚类中心最远的距离D(x),并以一定概率
选择新中心点ai;
(3)重复第二步。
简单的来说,K-means++就是选择离已选中心点最远的点。这也比较符合常理,聚类中心当然是互相离得越远越好。但是这个算法的缺点在于,难以并行化。所以k-meansII改变取样策略,并非按照k-means++那样每次遍历只取样一个样本,而是每次遍历取样k个,重复该取样过程log(n)次,则得到klog(n)个样本点组成的集合,然后从这些点中选取k个。当然一般也不需要log(n)次取样,5次即可。
算法终止条件
终止条件一般为以下几类:
a、达到预先设定的迭代次数,如20次。
b、类中心点不再发生变化或没有对象被分配给新的类。
c、误差平方和最小,误差平方和公式:
其中Xi代表被分到第i类的对象集合,μc(i)代表第i个聚类的均值(即类中心),c可以理解为迭代这个步骤,因为c随着迭代而发生变化,所以也是个变量。
在实际编程实现算法时,a常配合着c(误差平方和最小化)一起使用,由于使误差平方和最小有时会陷入死循环或迭代多步类中心变化不大,因此常会限制迭代次数。
K-means算法特点
◆优点:
可以简单地、快速地处理大型数据集,并且具有可伸缩性,当在类别之间明确区分数据集(凸形分布)时,聚类效果最佳。
◆缺点:
用户需要自己确定并给出k的值,即簇的数量(聚类的数目),而对于簇的数量,事先难以确定出一个较为合理的值;
k均值算法对k的值较为敏感,如果k的值取得不合理,则最终的结果可能只是局部最优的。
K-means算法应用场景
1、隐含类别的数据较为平衡的情况,如隐含类别的数据量差别较大,则聚类的效果就较差。
2、数据最好是凸数据,即隐含类别间的差异越大,则聚类效果越好,因为中心点不再变化所需要的迭代次数较少,比较容易收敛。
3、一般作为数据预处理,或者用于辅助分类贴标签使用,因为在已经经过分类的数据上再进行聚类,准确度会非常高。
sklearn.cluster.Kmeans函数的应用
sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True ,n_jobs='deprecated', algorithm='auto')
参数说明:
n_clusters:int, default=8,簇的个数,即你想聚成几类。
init:{‘k-means++’, ‘random’, ndarray, callable},
· default=’k-means++’,初始簇中心的获取方法,‘k-means ++’:以一种聪明的方式为k-mean聚类选择初始聚类中心,以加快收敛速度。有关更多详细信息,请参见k_init中的注释部分。
·random:n_clusters从初始质心的数据中随机选择观察(行)。
·如果传递了ndarray,则其形状应为(n_clusters,n_features),并给出初始中心。
·如果传递了callable,则应使用参数X,n_clusters和随机状态并返回初始化。
n_init:int, default=10,获取初始簇中心的更迭次数,k均值算法将在不同质心种子下运行的次数。
max_iter:int, default=300,最大迭代次数(因为kmeans算法的实现需要迭代),单次运行的k均值算法的最大迭代次数。
tol:float, default=1e-4,容忍度,即kmeans运行准则收敛的条件,关于Frobenius范数的相对容差,该范数表示两个连续迭代的聚类中心的差异,以声明收敛。
precompute_distances:{‘auto’, True, False}, default=‘auto’,是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的。
verbose:int, default=0,冗长模式(不太懂是啥意思,反正一般不去改默认值)。
random_state:int, RandomState instance, default=None,确定质心初始化的随机数生成。使用整数使随机性具有确定性。
copy_x:bool, default=True, 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
n_job:sint, default=None,并行设置。
algorithm:{‘auto’, ‘full’, ‘elkan’}, default=‘auto’,kmeans的实现算法,经典的EM风格算法是’full’的。通过使用三角形不等式,‘elkan’变异对于定义良好的聚类的数据更有效。但是,由于分配了额外的形状数组(n_samples,n_clusters),因此需要更多的内存。目前,‘auto’(保持向后兼容性)选择’elkan’,但为了更好的启发式,将来可能会更改。
DBSCAN算法
DBSCAN算法基于样本之间的密度实现空间聚类,基于边界点,核心点以及噪声点等因素对空间中任何形状的样本数据进行聚类。
DBSCAN算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。
基本原理
算法的关键在于样本的‘聚集程度’,这个程度的刻画可以由聚集半径和最小聚集数两个参数来描述。如果一个样本聚集半径领域内的样本数达到了最小聚集数,那么它所在区域就是密集的,就可以围绕该样本生成簇落,这样的样本被称为核心点。如果一个样本在某个核心点的聚集半径领域内,但其本身又不是核心点,则被称为边界点;既不是核心点也不是边界点的样本即为噪声点。其中,最小聚集数通常由经验指定,一般是数据维数+1或者数据维数的2倍。
通俗地讲,核心点就是构成一个簇落的核心成员;边界点就是构成一个簇落的非核心成员,它们分布于簇落的边界区域;噪声点是无法归属在任何一个簇集的游离的异常样本。
算法描述
输入:样本集D,聚集半径r,最小聚集数MinPts;
输出:簇集C1,C2,…,Cn,噪声集O.
根据样本聚集程度,传播式地划定聚类簇,并将不属于任何一个簇的样本划入噪声集合。
(1)随机搜寻一个核心点p,
‘
(2)在核心点p处建立簇C,将r邻域内所有的点加入簇C.
(3)对邻域内所有未被标记的点迭代式进行考察,扩展簇集.若一个邻域点q为核心点,则将它领域内未归入集合的点加入簇C中.
(4)重复以上步骤,直至所有样本划入了指定集合;
(5)输出簇集C1,C2,…,Cn和噪声集合O。
DBSCAN详细描述及参数含义
DBSCAN算法步骤
特点
◆与传统的k-均值相比,DBSCAN通过邻域半径和密度阈值自动生成聚类,无需指定聚类的数量,并支持噪声点的过滤
◆当数据量增加时,算法的空间复杂度将升高,因此,DBSCAN不适合样本之间的密度不均匀的情况,否则聚类的质量将不会很好
◆对于高维度的数据,一方面,密度的定义较为困难,另一方面,也将出现大量的计算,从而很大程度地降低了聚类的效率
优势
1.可以发现任意形状的簇,适用于非凸数据集;
2.可以进行异常检测;
3.不需要指定簇数,根据样本的密集程度适应性地聚集。
不足
1.当样本集密度不均匀,不同簇中的平均密度相差较大时,效果较差;
2.聚集半径和最小聚集数两个参数需人工指定。
示例
假设二维空间中有下列样本,坐标为(1,2),(1,3),(3,1),(2,2),(9,8),(8,9),(9,9),(18,18)
由DBSCAN算法完成聚类操作。
过程演算:
由经验指定参数聚集半径r=2,最小聚集数MinPts=3。
(1)随机搜寻一个核心点,若不存在,返回噪声集合。考察点(1,2),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共三个样本点,达到了MinPts数,因此(1,2)为核心点。
在核心点(1,2)处建立簇C1,原始簇成员为r邻域内样本:(1,2)、(1,3)、(2,2)。
(3)对簇落C1成员迭代式进行考察,扩展簇集。先考察(1,3),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共三个样本点,达到了MinPts数,因此(1,3)为核心点,它邻域内的样本均已在簇C1中,无需进行操作。
再考察(2,2),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共四个样本点,达到了MinPts数,因此(2,2)为核心点,将它领域内尚未归入任何一个簇落的点(3,1)加入簇C1。
再考察(3,1),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共两个样本点,因此(3,1)是非核心点。
考察结束,簇集C1扩展完毕。
(4)在其余未归簇的样本点中搜寻一个核心点,若不存在,返回噪声集合。考察点(9,8),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共三个样本点,达到了MinPts数,因此(9,8)为核心点。
(5)在核心点(9,8)处建立簇C2,原始簇成员为r邻域内样本:(9,8)、(8,9)、(9,9)。
(6)对簇落C2成员迭代式进行考察,扩展簇集。先考察(8,9),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共三个样本点,达到了MinPts数,因此(8,9)为核心点,它邻域内的样本均已在簇C2中,无需进行操作。
再考察(9,9),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共三个样本点,达到了MinPts数,因此(9,9)为核心点。它邻域内的样本均已在簇C2中,无需进行操作。
考察结束,簇集C2扩展完毕。
(7)在其余未归簇的样本点中搜寻一个核心点,若不存在,返回噪声集合。其余未归簇的样本点集合为{(18,18)},考察(18,18),它到各点的距离分别为
在它的r邻域内,包括了自身在内的共一个样本点,未达到MinPts数,因此(18,18)为非核心点。其余未归簇的样本中不存在核心点,因此归入噪声集O={(18,18)}。
(8)输出聚类结果
簇类C1:{(1,2),(1,3),(3,1),(2,2)}
簇类C2:{(9,8),(8,9),(9,9)}
噪声集O:{(18,18)}
DBSCAN算法在python scikit-learn实现
在scikit-learn中,DBSCAN算法类为sklearn.cluster.DBSCAN。要熟练的掌握用DBSCAN类来聚类,除了对DBSCAN本身的原理有较深的理解以外,还要对最近邻的思想有一定的理解。
DBSCAN算法本身的参数:
1)eps: DBSCAN算法参数,即我们的ϵ-邻域的距离阈值,和样本距离超过ϵ的样本点不在ϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。
2)min_samples: DBSCAN算法参数,即样本点要成为核心对象所需要的ϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。
最近邻度量的参数
3)metric:最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)就可以满足我们的需求。可以使用的距离度量参数有:
a) 欧式距离 “euclidean”
b) 曼哈顿距离 “manhattan”
c) 切比雪夫距离“chebyshev”
d) 闵可夫斯基距离 “minkowski”
e) 带权重闵可夫斯基距离 “wminkowski”
f) 标准化欧式距离 “seuclidean”: 即对于各特征维度做了归一化以后的欧式距离。此时各样本特征维度的均值为0,方差为1.
g) 马氏距离“mahalanobis”:当样本分布独立时,马氏距离等同于欧式距离。
还有一些其他不是实数的距离度量,一般在DBSCAN算法用不上,这里也就不列了。
4)algorithm:最近邻搜索算法参数,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用"auto"建树时间可能会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。
5)leaf_size:最近邻搜索算法参数,为使用KD树或者球树时, 停止建子树的叶子节点数量的阈值。这个值越小,则生成的KD树或者球树就越大,层数越深,建树时间越长,反之,则生成的KD树或者球树会小,层数较浅,建树时间较短。默认是30. 因为这个值一般只影响算法的运行速度和使用内存大小,因此一般情况下可以不管它。
6) p: 最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。
以上就是DBSCAN类的主要参数介绍,需要调参的两个参数eps和min_samples,这两个值的组合对最终的聚类效果有很大的影响。
OPTICS算法
背景
◆在DBSCAN算法中,用户需要指定两个初始参数,分别是ε(邻域半径)和minPts(ε邻域中的最小点数)
◆用户通过手动设置这两个参数将对聚类的结果产生较为关键的影响
OPTICS算法很好地解决了上述问题,并生成了用于聚类分析的增广的簇排序,该簇排序表示了每个样本点基于密度的聚类结构
算法简介
OPTICS是一种基于密度的聚类算法,可以有效地识别具有不同密度的数据簇。与DBSCAN不同,OPTICS不需要事先知道簇的数量。它通过在数据集中生成一个基于密度的可达性图来工作,从而可以在处理具有任意形状的簇时表现出良好的性能。
OPTICS是DBSCAN聚类的改进算法,其对输入参数不敏感。此外,对只要确定minPts的值,半径eps的轻微变化,并不会影响聚类结果。OPTICS并不显式产生聚类簇,而是生成一个增广的簇排序(比如,以可达距离为纵轴,样本点输出次序为横轴的坐标图),这个排序代表了各样本点基于密度的聚类结构,从此排序中可以得到基于任何参数eps和minPts的DBSCAN算法的聚类结果。
OPTICS聚类:
有效的解决了密度不同导致的聚类效果不好的问题。
核心距离:
只有核心对象才有核心距离,在核心对象中,最小邻域内密度达到阈值时的半径值。如 果样本的核心距离小于半径则为核心点,否则不是核心点。
可达距离:
只有核心对象才有可达距离,用于对样本点排序;
聚类顺序:
从低层到高层 ; 从稠密到稀疏 ;
聚类时 , 低层聚类分组先构建完成 , 也就是半径ε参数较小的聚类分组 ;
密度可达的两种情况情况 :
①ε参数小 : ε参数较小的时两个样本就密度可达 ;
②ε参数大 : ε参数取值很大时, 才密度可达 ;
扩展样本优先级 :
扩展样本对象时, 优先选择第一种情况,ε参数较小的时就可密度可达的样本;
每个样本对象需要存储两个值 :
核心距离 与 可达距离 。
OPTICS算法流程
(1) 创建两个队列,有序队列和结果队列。
·有序队列用于存储core points及其密度直达points, 并按可达距离升序排列。有序队列中的points为待处理样本;
·结果队列用于存储样本点的输出次序。结果队列中的points为处理之后的样本;
(2) 选取一个未处理的core point, 将其放入结果队列,同时计算邻域内样本点的可达距离,按照可达距离升序将样本点依次放入有序队列。
(3) 若有序队列为空,则回到步骤2(重新选取处理数据)。否则,从有序队列中提取第一个样本,如果为core point, 则计算可达距离,将可达距离最小的点放入结果队列。如果不是core point, 则重复步骤2;
·如果有序队列中已经存在直接密度可达点,如果此时新的可达距离小于旧的可达距离,则用新可达距离取代旧可达距离,有序队列重新排序(因为一个对象可能有多个核心对象可达);
·如果有序队列中不存在该直接密度可达样本点,则插入该点,并对有序队列重新排序;
(4) 迭代(2),(3),直到数据集中所有点都处理完成,则算法结束,输出结果队列中有序样本点。
在Python中使用scikit-learn库中的`sklearn.cluster.OPTICS`类
主要参数:
·`min_samples`: 用于定义一个数据点的邻域中必须包含的最少数据点数。默认值为5。
·`xi`: 用于控制点之间的相似度度量。默认值为0.05。
·`min_cluster_size`: 用于定义簇的最小数量。默认值为None(自适应)。
·`max_eps`: 用于定义一个点的邻域的最大半径。默认值为inf。
主要函数:
·`fit(X)`: 对数据集X进行聚类,并返回OPTICS聚类器对象。
·`fit_predict(X)`: 对数据集X进行聚类,并返回聚类标签。
·`set_params(**params)`: 设置OPTICS聚类器的参数。
·`get_params()`: 获取OPTICS聚类器的参数。
需要注意的是,由于OPTICS算法的计算复杂度较高,因此在处理大数据集时可能会遇到效率问题。在这种情况下,可以考虑使用DBSCAN或BIRCH等其他聚类算法来代替。