聚类入侵算法
① 有哪些常用的聚类算法
聚类分析计算方法主要有如下几种:
1.
划分法(partitioning
methods)
给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K
评论
0
0
0
加载更多
② 数据挖掘 聚类算法概述
文 | 宿痕
来源 | 知乎
本篇重点介绍聚类算法的原理,应用流程、使用技巧、评估方法、应用案例等。具体的算法细节可以多查阅相关的资料。聚类的主要用途就是客户分群。
1.聚类 VS 分类
分类是“监督学习”,事先知道有哪些类别可以分。
聚类是“无监督学习”,事先不知道将要分成哪些类。
举个例子,比如苹果、香蕉、猕猴桃、手机、电话机。
根据特征的不同,我们聚类会分为【苹果、香蕉、猕猴桃】为水果的一类,和【手机、电话机】为数码产品的一类。
而分类的话,就是我们在判断“草莓”的时候,把它归为“水果”一类。
所以通俗的解释就是:分类是从训练集学习对数据的判断能力,再去做未知数据的分类判断;而聚类就是把相似的东西分为一类,它不需要训练数据进行学习。
学术解释:分类是指分析数据库中的一组对象,找出其共同属性。然后根据分类模型,把它们划分为不同的类别。分类数据首先根据训练数据建立分类模型,然后根据这些分类描述分类数据库中的测试数据或产生更恰当的描述。
聚类是指数据库中的数据可以划分为一系列有意义的子集,即类。在同一类别中,个体之间的距离较小,而不同类别上的个体之间的距离偏大。聚类分析通常称为“无监督学习”。
2.聚类的常见应用
我们在实际情况的中的应用会有:
marketing:客户分群
insurance:寻找汽车保险高索赔客户群
urban planning:寻找相同类型的房产
比如你做买家分析、卖家分析时,一定会听到客户分群的概念,用标准分为高价值客户、一般价值客户和潜在用户等,对于不同价值的客户提供不同的营销方案;
还有像在保险公司,那些高索赔的客户是保险公司最care的问题,这个就是影响到保险公司的盈利问题;
还有在做房产的时候,根据房产的地理位置、价格、周边设施等情况聚类热房产区域和冷房产区域。
3.k-means
(1)假定K个clusters(2)目标:寻找紧致的聚类
a.随机初始化clusters
b.分配数据到最近的cluster
c.重复计算clusters
d.repeat直到收敛
优点:局部最优
缺点:对于非凸的cluster有问题
其中K=?
K<=sample size
取决于数据的分布和期望的resolution
AIC,DIC
层次聚类避免了这个问题
4.评估聚类
鲁棒性?
聚类如何,是否过度聚合?
很多时候是取决于聚合后要干什么。
5.case案例
case 1:卖家分群云图
作者:宿痕 授权转载
原文链接:http://zhuanlan.hu.com/dataman/20397891
③ 聚类的计算方法
传统的聚类分析计算方法主要有如下几种:
1、划分方法(partitioning methods)
给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K<N。而且这K个分组满足下列条件:(1) 每一个分组至少包含一个数据纪录;(2)每一个数据纪录属于且仅属于一个分组(注意:这个要求在某些模糊聚类算法中可以放宽);对于给定的K,算法首先给出一个初始的分组方法,以后通过反复迭代的方法改变分组,使得每一次改进之后的分组方案都较前一次好,而所谓好的标准就是:同一分组中的记录越近越好,而不同分组中的纪录越远越好。使用这个基本思想的算法有:K-MEANS算法、K-MEDOIDS算法、CLARANS算法;
大部分划分方法是基于距离的。给定要构建的分区数k,划分方法首先创建一个初始化划分。然后,它采用一种迭代的重定位技术,通过把对象从一个组移动到另一个组来进行划分。一个好的划分的一般准备是:同一个簇中的对象尽可能相互接近或相关,而不同的簇中的对象尽可能远离或不同。还有许多评判划分质量的其他准则。传统的划分方法可以扩展到子空间聚类,而不是搜索整个数据空间。当存在很多属性并且数据稀疏时,这是有用的。为了达到全局最优,基于划分的聚类可能需要穷举所有可能的划分,计算量极大。实际上,大多数应用都采用了流行的启发式方法,如k-均值和k-中心算法,渐近的提高聚类质量,逼近局部最优解。这些启发式聚类方法很适合发现中小规模的数据库中小规模的数据库中的球状簇。为了发现具有复杂形状的簇和对超大型数据集进行聚类,需要进一步扩展基于划分的方法。
2、层次方法(hierarchical methods)
这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。具体又可分为“自底向上”和“自顶向下”两种方案。例如在“自底向上”方案中,初始时每一个数据纪录都组成一个单独的组,在接下来的迭代中,它把那些相互邻近的组合并成一个组,直到所有的记录组成一个分组或者某个条件满足为止。代表算法有:BIRCH算法、CURE算法、CHAMELEON算法等;
层次聚类方法可以是基于距离的或基于密度或连通性的。层次聚类方法的一些扩展也考虑了子空间聚类。层次方法的缺陷在于,一旦一个步骤(合并或分裂)完成,它就不能被撤销。这个严格规定是有用的,因为不用担心不同选择的组合数目,它将产生较小的计算开销。然而这种技术不能更正错误的决定。已经提出了一些提高层次聚类质量的方法。
3、基于密度的方法(density-based methods)
基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。这个方法的指导思想就是,只要一个区域中的点的密度大过某个阀值,就把它加到与之相近的聚类中去。代表算法有:DBSCAN算法、OPTICS算法、DENCLUE算法等;
4、基于网格的方法(grid-based methods)
这种方法首先将数据空间划分成为有限个单元(cell)的网格结构,所有的处理都是以单个的单元为对象的。这么处理的一个突出的优点就是处理速度很快,通常这是与目标数据库中记录的个数无关的,它只与把数据空间分为多少个单元有关。代表算法有:STING算法、CLIQUE算法、WAVE-CLUSTER算法;
很多空间数据挖掘问题,使用网格通常都是一种有效的方法。因此,基于网格的方法可以和其他聚类方法集成。
5、基于模型的方法(model-based methods)
基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。这样一个模型可能是数据点在空间中的密度分布函数或者其它。它的一个潜在的假定就是:目标数据集是由一系列的概率分布所决定的。通常有两种尝试方向:统计的方案和神经网络的方案。
当然聚类方法还有:传递闭包法,布尔矩阵法,直接聚类法,相关性分析聚类,基于统计的聚类方法等。
④ 聚类算法的具体方法
k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。
k-means 算法的工作过程说明如下:
首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;
然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。
一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。 K-MEANS有其缺点:产生类的大小相差不会很大,对于脏数据很敏感。
改进的算法:k—medoids 方法。这儿选取一个对象叫做mediod来代替上面的中心的作用,这样的一个medoid就标识了这个类。K-medoids和K-means不一样的地方在于中心点的选取,在K-means中,我们将中心点取为当前cluster中所有数据点的平均值,在 K-medoids算法中,我们将从当前cluster 中选取这样一个点——它到其他所有(当前cluster中的)点的距离之和最小——作为中心点。
步骤:
1,任意选取K个对象作为medoids(O1,O2,…Oi…Ok)。
以下是循环的:
2,将余下的对象分到各个类中去(根据与medoid最相近的原则);
3,对于每个类(Oi)中,顺序选取一个Or,计算用Or代替Oi后的消耗—E(Or)。选择E最小的那个Or来代替Oi。这样K个medoids就改变了,下面就再转到2。
4,这样循环直到K个medoids固定下来。
这种算法对于脏数据和异常数据不敏感,但计算量显然要比K均值要大,一般只适合小数据量。 上面提到K-medoids算法不适合于大数据量的计算。Clara算法,这是一种基于采样的方法,它能够处理大量的数据。
Clara算法的思想就是用实际数据的抽样来代替整个数据,然后再在这些抽样的数据上利用K-medoids算法得到最佳的medoids。Clara算法从实际数据中抽取多个采样,在每个采样上都用K-medoids算法得到相应的(O1, O2 … Oi … Ok),然后在这当中选取E最小的一个作为最终的结果。 Clara算法的效率取决于采样的大小,一般不太可能得到最佳的结果。
在Clara算法的基础上,又提出了Clarans的算法,与Clara算法不同的是:在Clara算法寻找最佳的medoids的过程中,采样都是不变的。而Clarans算法在每一次循环的过程中所采用的采样都是不一样的。
与上面所讲的寻找最佳medoids的过程不同的是,必须人为地来限定循环的次数。
⑤ PhenoGraph聚类算法
PhenoGraph算法的输入是一个N X D的矩阵, 把这个矩阵中的行划分到类别中,使得类别间的差异大于类别内的差异。
我们的假设是,这些类别代表具有生物学意义表型的细胞群。我们的前提假设是细胞群聚集在D维空间的密集区域,由紧密Marker表达组合定义。因此,我们的目标是在D维空间中辨别这些密集的细胞区域。然而,我们不知道数据中类别的数量,大小或高维形状(例如,椭球,凸)。 单细胞域(domain)特别具有挑战性,因为不同类别之间,类别大小可能会有数量级上的差异(例如,造血干细胞与T细胞),并且我们希望识别罕见子集(类别)而不是将它们作为离群点而丢弃。此外,虽然大多数聚类算法都假设类别内样本分布近似椭球形,但我们已经证明许多细胞亚类具有复杂的形状并且不一定是凸形的(viSNE enables visualization of high dimensional single-cell data and reveals phenotypic heterogeneity of leukemia. Nat Biotechnol. 2013)。 用于密度检测的参数方法需要关于细胞群体(例如,椭球,凸)的形状的强依赖性假设,而单细胞数据中通常不符合这样的假设。
为了克服这些障碍,我们构建了一个图形结构来表示单细胞数据中细胞状态的高维几何结构。每个细胞作为节点并且通过边连接到其邻居细胞(与其最相似的细胞),该边的权重由细胞之间的相似性设置。细胞在高维空间中的密集区域将在该图中表现为高度互连的模块,通过该模块内具有高密度的边的特征来识别。一旦构建完毕,该图可以被划分成这些紧密互连的模块的子集,称为群体(communities),代表不同的表型亚群(类别)。这些图中的群体(communities)的检测(Community structure in social and biological networks. Proc. Natl. Acad. Sci. 2002)为识别亚群提供了一种高效方法。与混合模型等参数化方法不同,该方法不假设子群(某一类别)的大小、分布或数量。该方法成功的关键是构造一个图形结构,这个图形结构真实的表示D维空间中存在的几何结构。PhenoGraph分两步建立单细胞数据的图结构。
第一步,使用欧式距离为每个细胞识别k个最近邻居,其中k是该方法的唯一参数;如果k值太大,较小的群体(communities)会受到其他节点的影响,难以被识别出来。而如果,k值太小会导致我们想要找的细胞群体内紧密度较差。
因此,在第二步中,我们改进了第一步中定义的k邻居。对所有细胞的k近邻搜索的结果是一组集合:N组k邻居。我们对这些集合进行操作以建立一个加权图。在这个图中,每对节点(细胞)之间的权重是基于它们共享的邻居的数量。
节点i和j之间的权重由以下公式给出:
其中v(i)是节点i的k邻居;v(j)是节点j的k邻居。
以这种方式由真实数据构造的图具有明显的模块化结构。
群体(communities)检测是指将节点划分成不同的群体(communities),从而捕获这个模块化结构。对于一组群体(communities)的确定C={c_(1,) c_(2,),…,c_k},模块系数Q的定义由下面公式确定:
其中Wij是节点i,j的边权重,si是节点i与其他所有节点的边权重加和,sj同上,ci是节点i所在的群体(communities),如果u=v,Kronecker delta 函数δ(u,v)=1;否则为0,m=1/2 ∑▒W_ij 是一个标准化常数。
模块系数Q介于-1到1之间,对于任意一个确定了群体(communities)图结构都可以计算这么一个指标。所以该指标可以作为客观衡量把图结构区分成子集的质量。这样,该问题就转化成一个组合优化问题,即NP完全问题。
接下来用Louvain方法(Fast unfolding of communities in large networks. J. Stat. Mech. 2008)来解决上述问题。Louvain方法具体步骤是,在第一次迭代时,每一个节点(细胞)被单独作为一类(一个群体),在每一次迭代时,若两个节点的合并能使得模块系数Q有最大的增长,那么将这两个节点合并成一类。直到模块系数Q不再增加为止。
REF: Data-Driven Phenotypic Dissection of AML Reveals Progenitor-like Cells that Correlate with Prognosis. 2015 Cell.
检测群体(communities)结构对于发现复杂网络中结构与功能之间的联系以及生物学和社会学等许多学科的实际应用至关重要。现在广泛使用的一种流行方法依赖于对模块的数量的优化,这是将网络划分为群体(communities)的质量指标。我们发现,即使在模块定义明确的情况下,模块化优化也可能无法识别小于一定规模的模块,该模块的规模取决于网络的总大小和模块的互连程度。Newman和Girvan(Finding and evaluating community structure in networks. Physical review E, 2004.)在群体(communities)检测方面取得了决定性的进展,他们引入了一种定量方法来衡量将网络划分为群体(communities)的质量,即模块化。该度量实质上将给定模块内的连接数与相同大小和相同度数序列的随机图的期望值进行比较。如果选择模块化作为相关质量函数,则群体(communities)检测的问题就等同于模块化优化。后者非常重要,因为将网络划分为群体(communities)的可能性至少随着网络的大小呈指数增长,即使对于较小的图,穷举式优化在计算上也不可行。我们表明模块化优化确实不能解决大数量的模块。因此,有必要对通过模块化优化获得的模块进行检查。我们表明,模块化存在一个固有规模,该规模取决于网络中边的总数。小于此规模的模块可能无法解析,即使在极端情况下,它们是通过单桥连接的完整图形。模块化分辨率的极限实际上取决于群体(communities)对之间的互连程度,并且可以达到整个网络大小的数量级。因此,事先无法确定通过模块化优化检测到的模块(大还是小)确实是单个模块还是多个较小模块的集合。然而,最大模块性因网络的不同而不同,并且取决于网络的连接数。我们证明了任何网络的模块性值的上限都是1,并且我们看到模块性是与网络尺度相关的。
REF: Resolution limit in community detection. 2007 PNAS.
函数FindClusters
FindClusters(object, molarity.fxn = 1, initial.membership = NULL, weights = NULL, node.sizes = NULL, resolution = 0.8, algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ...)
参数
#object: Seurat Object
#molarity.fxn: 计算模块系数函数,1为标准函数;2为备选函数,这里没有具体说明是什么函数,我认为1是上面提到的Kronecker delta函数。
# resolution: 分辨率参数,如果大于1,则会得到较多数目的群体(communities);如果小于1,则会得到较少数目的群体(communities)。
#algorithm: 模块系数优化算法,1使用原始Louvain算法;2使用Louvain algorithm with multilevel refinement;3使用SLM算法;4使用Leiden算法(注:4需要额外安装插件)
#n.start: 随机开始的数量
#n.iter: 最大迭代次数
#random.seed: 随机数种子
#graph.name: 图的名字
#group.singletons: (TRUE/FALSE)是否把比较特异的细胞分配到最近的类别中,若FALSE,则可能会出现某个类只有一个细胞的情况
#verbose: 是否在控制台输出结果
⑥ 哪位高手有聚类算法在入侵检测中的应用的源代码
不要问了.直接搜一下....看下能不能找得到,再不行去SOSO.GOOGLE.里面去找一下...这个懂的人N多少.能看到你这个问题的人更少了.....
⑦ 什么是聚类分析聚类算法有哪几种
聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于
分类学,在古老的分类学中,人们主要依靠经验和专业知识来实现分类,很少利用数学工具进行
定量的分类。随着人类科学技术的发展,对分类的要求越来越高,以致有时仅凭经验和专业知识
难以确切地进行分类,于是人们逐渐地把数学工具引用到了分类学中,形成了数值分类学,之后又
将多元分析的技术引入到数值分类学形成了聚类分析。
聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论
聚类法、聚类预报法等。
聚类分析计算方法主要有如下几种:分裂法(partitioning methods):层次法(hierarchical
methods):基于密度的方法(density-based methods): 基于网格的方法(grid-based
methods): 基于模型的方法(model-based methods)。
⑧ 常用的聚类方法有哪几种
聚类分析的算法可以分为划分法、层次法、基于密度的方法、基于网格的方法、基于模型的方法。
1、划分法,给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K<N。
2、层次法,这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。
3、基于密度的方法,基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。
4、图论聚类方法解决的第一步是建立与问题相适应的图,图的节点对应于被分析数据的最小单元,图的边(或弧)对应于最小处理单元数据之间的相似性度量。
5、基于网格的方法,这种方法首先将数据空间划分成为有限个单元的网格结构,所有的处理都是以单个的单元为对象的。
6、基于模型的方法,基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。
(8)聚类入侵算法扩展阅读:
在商业上,聚类可以帮助市场分析人员从消费者数据库中区分出不同的消费群体来,并且概括出每一类消费者的消费模式或者说习惯。
它作为数据挖掘中的一个模块,可以作为一个单独的工具以发现数据库中分布的一些深层的信息,并且概括出每一类的特点,或者把注意力放在某一个特定的类上以作进一步的分析;并且,聚类分析也可以作为数据挖掘算法中其他分析算法的一个预处理步骤。
许多聚类算法在小于 200 个数据对象的小数据集合上工作得很好;但是,一个大规模数据库可能包含几百万个对象,在这样的大数据集合样本上进行聚类可能会导致有偏的结果。
许多聚类算法在聚类分析中要求用户输入一定的参数,例如希望产生的簇的数目。聚类结果对于输入参数十分敏感。参数通常很难确定,特别是对于包含高维对象的数据集来说。这样不仅加重了用户的负担,也使得聚类的质量难以控制。
⑨ 大数据分析之聚类算法
大数据分析之聚类算法
1. 什么是聚类算法
所谓聚类,就是比如给定一些元素或者对象,分散存储在数据库中,然后根据我们感兴趣的对象属性,对其进行聚集,同类的对象之间相似度高,不同类之间差异较大。最大特点就是事先不确定类别。
这其中最经典的算法就是KMeans算法,这是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
KMeans算法本身思想比较简单,但是合理的确定K值和K个初始类簇中心点对于聚类效果的好坏有很大的影响。
聚类算法实现
假设对象集合为D,准备划分为k个簇。
基本算法步骤如下:
1、从D中随机取k个元素,作为k个簇的各自的中心。
2、分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇。
3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数。
4、将D中全部元素按照新的中心重新聚类。
5、重复第4步,直到聚类结果不再变化。
6、将结果输出。
核心Java代码如下:
/**
* 迭代计算每个点到各个中心点的距离,选择最小距离将该点划入到合适的分组聚类中,反复进行,直到
* 分组不再变化或者各个中心点不再变化为止。
* @return
*/
public List[] comput() {
List[] results = new ArrayList[k];//为k个分组,分别定义一个聚簇集合,未来放入元素。
boolean centerchange = true;//该变量存储中心点是否发生变化
while (centerchange) {
iterCount++;//存储迭代次数
centerchange = false;
for (int i = 0; i < k; i++) {
results[i] = new ArrayList<T>();
}
for (int i = 0; i < players.size(); i++) {
T p = players.get(i);
double[] dists = new double[k];
for (int j = 0; j < initPlayers.size(); j++) {
T initP = initPlayers.get(j);
/* 计算距离 这里采用的公式是两个对象相关属性的平方和,最后求开方*/
double dist = distance(initP, p);
dists[j] = dist;
}
int dist_index = computOrder(dists);//计算该点到各个质心的距离的最小值,获得下标
results[dist_index].add(p);//划分到对应的分组。
}
/*
* 将点聚类之后,重新寻找每个簇的新的中心点,根据每个点的关注属性的平均值确立新的质心。
*/
for (int i = 0; i < k; i++) {
T player_new = findNewCenter(results[i]);
System.out.println("第"+iterCount+"次迭代,中心点是:"+player_new.toString());
T player_old = initPlayers.get(i);
if (!IsPlayerEqual(player_new, player_old)) {
centerchange = true;
initPlayers.set(i, player_new);
}
}
}
return results;
}
上面代码是其中核心代码,我们根据对象集合List和提前设定的k个聚集,最终完成聚类。我们测试一下,假设要测试根据NBA球员的场均得分情况,进行得分高中低的聚集,很简单,高得分在一组,中等一组,低得分一组。
我们定义一个Player类,里面有属性goal,并录入数据。并设定分组数目为k=3。
测试代码如下:
List listPlayers = new ArrayList();
Player p1 = new Player();
p1.setName(“mrchi1”);
p1.setGoal(1);
p1.setAssists(8);
listPlayers.add(p1);
Player p2 = new Player();
p2.setName("mrchi2");
p2.setGoal(2);
listPlayers.add(p2);
Player p3 = new Player();
p3.setName("mrchi3");
p3.setGoal(3);
listPlayers.add(p3);
//其他对象定义此处略。制造几个球员的对象即可。
Kmeans<Player> kmeans = new Kmeans<Player>(listPlayers, 3);
List<Player>[] results = kmeans.comput();
for (int i = 0; i < results.length; i++) {
System.out.println("类别" + (i + 1) + "聚集了以下球员:");
List<Player> list = results[i];
for (Player p : list) {
System.out.println(p.getName() + "--->" + p.getGoal()
}
}
算法运行结果:
可以看出中心点经历了四次迭代变化,最终分类结果也确实是相近得分的分到了一组。当然这种算法有缺点,首先就是初始的k个中心点的确定非常重要,结果也有差异。可以选择彼此距离尽可能远的K个点,也可以先对数据用层次聚类算法进行聚类,得到K个簇之后,从每个类簇中选择一个点,该点可以是该类簇的中心点,或者是距离类簇中心点最近的那个点。
⑩ 建议收藏!10 种 python 聚类算法完整操作示例
聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每种算法的不同配置。在本教程中,你将发现如何在 python 中安装和使用顶级聚类算法。完成本教程后,你将知道:
聚类分析,即聚类,是一项无监督的机器学习任务。它包括自动发现数据中的自然分组。与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。
群集通常是特征空间中的密度区域,其中来自域的示例(观测或数据行)比其他群集更接近群集。群集可以具有作为样本或点特征空间的中心(质心),并且可以具有边界或范围。
聚类可以作为数据分析活动提供帮助,以便了解更多关于问题域的信息,即所谓的模式发现或知识发现。例如:
聚类还可用作特征工程的类型,其中现有的和新的示例可被映射并标记为属于数据中所标识的群集之一。虽然确实存在许多特定于群集的定量措施,但是对所识别的群集的评估是主观的,并且可能需要领域专家。通常,聚类算法在人工合成数据集上与预先定义的群集进行学术比较,预计算法会发现这些群集。
有许多类型的聚类算法。许多算法在特征空间中的示例之间使用相似度或距离度量,以发现密集的观测区域。因此,在使用聚类算法之前,扩展数据通常是良好的实践。
一些聚类算法要求您指定或猜测数据中要发现的群集的数量,而另一些算法要求指定观测之间的最小距离,其中示例可以被视为“关闭”或“连接”。因此,聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。scikit-learn 库提供了一套不同的聚类算法供选择。下面列出了10种比较流行的算法:
每个算法都提供了一种不同的方法来应对数据中发现自然组的挑战。没有最好的聚类算法,也没有简单的方法来找到最好的算法为您的数据没有使用控制实验。在本教程中,我们将回顾如何使用来自 scikit-learn 库的这10个流行的聚类算法中的每一个。这些示例将为您复制粘贴示例并在自己的数据上测试方法提供基础。我们不会深入研究算法如何工作的理论,也不会直接比较它们。让我们深入研究一下。
在本节中,我们将回顾如何在 scikit-learn 中使用10个流行的聚类算法。这包括一个拟合模型的例子和可视化结果的例子。这些示例用于将粘贴复制到您自己的项目中,并将方法应用于您自己的数据。
1.库安装
首先,让我们安装库。不要跳过此步骤,因为你需要确保安装了最新版本。你可以使用 pip Python 安装程序安装 scikit-learn 存储库,如下所示:
接下来,让我们确认已经安装了库,并且您正在使用一个现代版本。运行以下脚本以输出库版本号。
运行该示例时,您应该看到以下版本号或更高版本。
2.聚类数据集
我们将使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例,每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的,因此我们可以用散点图绘制数据,并通过指定的群集对图中的点进行颜色绘制。这将有助于了解,至少在测试问题上,群集的识别能力如何。该测试问题中的群集基于多变量高斯,并非所有聚类算法都能有效地识别这些类型的群集。因此,本教程中的结果不应用作比较一般方法的基础。下面列出了创建和汇总合成聚类数据集的示例。
运行该示例将创建合成的聚类数据集,然后创建输入数据的散点图,其中点由类标签(理想化的群集)着色。我们可以清楚地看到两个不同的数据组在两个维度,并希望一个自动的聚类算法可以检测这些分组。
已知聚类着色点的合成聚类数据集的散点图接下来,我们可以开始查看应用于此数据集的聚类算法的示例。我已经做了一些最小的尝试来调整每个方法到数据集。3.亲和力传播亲和力传播包括找到一组最能概括数据的范例。
它是通过 AffinityPropagation 类实现的,要调整的主要配置是将“ 阻尼 ”设置为0.5到1,甚至可能是“首选项”。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法取得良好的结果。
数据集的散点图,具有使用亲和力传播识别的聚类
4.聚合聚类
聚合聚类涉及合并示例,直到达到所需的群集数量为止。它是层次聚类方法的更广泛类的一部分,通过 AgglomerationClustering 类实现的,主要配置是“ n _ clusters ”集,这是对数据中的群集数量的估计,例如2。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组。
使用聚集聚类识别出具有聚类的数据集的散点图
5.BIRCHBIRCH
聚类( BIRCH 是平衡迭代减少的缩写,聚类使用层次结构)包括构造一个树状结构,从中提取聚类质心。
它是通过 Birch 类实现的,主要配置是“ threshold ”和“ n _ clusters ”超参数,后者提供了群集数量的估计。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个很好的分组。
使用BIRCH聚类确定具有聚类的数据集的散点图
6.DBSCANDBSCAN
聚类(其中 DBSCAN 是基于密度的空间聚类的噪声应用程序)涉及在域中寻找高密度区域,并将其周围的特征空间区域扩展为群集。
它是通过 DBSCAN 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,尽管需要更多的调整,但是找到了合理的分组。
使用DBSCAN集群识别出具有集群的数据集的散点图
7.K均值
K-均值聚类可以是最常见的聚类算法,并涉及向群集分配示例,以尽量减少每个群集内的方差。
它是通过 K-均值类实现的,要优化的主要配置是“ n _ clusters ”超参数设置为数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组,尽管每个维度中的不等等方差使得该方法不太适合该数据集。
使用K均值聚类识别出具有聚类的数据集的散点图
8.Mini-Batch
K-均值Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的样本而不是整个数据集对群集质心进行更新,这可以使大数据集的更新速度更快,并且可能对统计噪声更健壮。
它是通过 MiniBatchKMeans 类实现的,要优化的主配置是“ n _ clusters ”超参数,设置为数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,会找到与标准 K-均值算法相当的结果。
带有最小批次K均值聚类的聚类数据集的散点图
9.均值漂移聚类
均值漂移聚类涉及到根据特征空间中的实例密度来寻找和调整质心。
它是通过 MeanShift 类实现的,主要配置是“带宽”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以在数据中找到一组合理的群集。
具有均值漂移聚类的聚类数据集散点图
10.OPTICSOPTICS
聚类( OPTICS 短于订购点数以标识聚类结构)是上述 DBSCAN 的修改版本。
它是通过 OPTICS 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法在此数据集上获得合理的结果。
使用OPTICS聚类确定具有聚类的数据集的散点图
11.光谱聚类
光谱聚类是一类通用的聚类方法,取自线性线性代数。
它是通过 Spectral 聚类类实现的,而主要的 Spectral 聚类是一个由聚类方法组成的通用类,取自线性线性代数。要优化的是“ n _ clusters ”超参数,用于指定数据中的估计群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,找到了合理的集群。
使用光谱聚类聚类识别出具有聚类的数据集的散点图
12.高斯混合模型
高斯混合模型总结了一个多变量概率密度函数,顾名思义就是混合了高斯概率分布。它是通过 Gaussian Mixture 类实现的,要优化的主要配置是“ n _ clusters ”超参数,用于指定数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我们可以看到群集被完美地识别。这并不奇怪,因为数据集是作为 Gaussian 的混合生成的。
使用高斯混合聚类识别出具有聚类的数据集的散点图
在本文中,你发现了如何在 python 中安装和使用顶级聚类算法。具体来说,你学到了: