聚类(二)

本文介绍了Clara、Clarans等抽样聚类算法,层级聚类方法包括凝聚与分割方式,并探讨了Birch、Cure等改进算法。还介绍了基于密度的DBSCAN、OPTICS及DENCLUE算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚 集(二)

2,Clara算法。

上次课提到K-medoids算法不适合于大数据量的计算。这次课我们介绍Clara算法,这是一种基于采用的方法,它能够处理大量的数据。

Clara算法的思想就是用实际数据的抽样来代替整个数据,然后再在这些抽样的数据上利用K-medoids算法得到最佳的medoids。Clara算法从实际数据中抽取多个采样,在每个采样上都用K-medoids算法得到相应的(O1,O2…Oi…Ok),然后在这当中选取E最小的一个作为最终的结果。

Clara算法的效率取决于采样的大小,一般不太可能得到最佳的结果。

在Clara算法的基础上,我们提出了Clarans的算法,与Clara算法不同的是:在Clara算法寻找最佳的medoids的过程中,采样都是不变的。而Clarans算法在每一次循环的过程中所采用的采样都是不一样的。与上次课所讲的寻找最佳medoids的过程不同的是,必须人为地来限定循环的次数。

四,层次聚类

层次聚类,就是把所有的记录层次聚类可以分为两种:凝聚的方式和分割的方式,取决于聚类层次结构的形成是自顶向下的还是自底向上的。

凝聚的方式:这是一种至底向上的方法,将每一条记录看作一个类,然后根据一些规则将他们聚合成越来越大的类,直到满足一些预先设定的条件。大多数的层次聚类方法属于这一类。

分割的方式:这种自顶向下的方法是一个与凝聚的方式相反的过程,将整个数据库作为一个大的类,然后按照一些规则将这个类分成小的类,直到满足一些预定的条件,例如类的数目到了预定值,最近的两个类之间的最小距离大于设定值。

例3:图5给出了对于集合{a,b,c,d,e}层次聚类两种方式的聚类过程。从这个图我们可以看出,凝聚的方式是将每一个记录看作一个类,再按照一定的规则逐步将这些类合并。举个例子,如果类C1和类C2之间的距离小于预定的最小距离,那么他们就会被合并为一个类,这儿两个类的距离是由两个类中距离最近的一对记录来确定的。

分割的方式则是先将所有的记录作为一个大的类,然后再根据一些规则将它进行分割,例如最近的两个记录之间的距离。

无论凝聚的方式还是分割方式,用户都可以根据自己的要求来设定所得类的个数。

下面给出了四种常用测定两个类之间距离的方法,这儿的mi是类ci的中间值,ni是ci中记录的个数,|p-p’|是两个记录之间的距离。

Minimum distance: Dmin(Ci,Cj)=Min|p-p’|;(这儿p在类Ci中p’在Cj中)

Maximum distance:Dmax(Ci,Cj)=Max|p-p’|;(这儿p在类Ci中p’在Cj中)

Mean distance: Dmean(Ci,Cj)=|mi-mj|;

Average distance: Davg(Ci,Cj)=(1/ni*nj)∑pЄci∑p’Єcj;

层次聚类虽然比较简单,但是在选择凝聚或者分割点的时候经常会遇到一些困难,这个是非常关键的,因为一旦记录被凝聚或者分割以后,下一步的工作是建立在新形成的类的基础之上的。因此,如果其中任何一步没有做好的话,就会影响最终聚类的结果。这个方法并不是太好,因为要牵涉到很大数量的类和记录。

一个比较有前途的能够提高聚类质量的方向是将层次聚类和其它的聚类结合起来进行,下面我们会介绍一些这样的方法:1,叫做“Birth”,它首先把层次聚类的形成过程到结果看作一棵树,然后再用其他的聚类方法来进行修剪。2,叫做“Cure”,他用一定数量的记录来代表一个类,然后将他们缩为类的中心。3,叫做“Rock”,它是基于类之间的联系将类合并。4,叫做“Chameleon”,在层次聚类中寻找自动的模式。

1,Birch:这是一种综合的层次聚类的方法,它介绍了两个概念,聚类特征和聚类特征树,它们是用来表示聚类的。这些结构能够帮助聚类方法能运行得更快,能够处理大数据量。

下面我们来看一下上面提到的结构,一个聚类特征是由关于记录子集的三重总概变量组成。假设在一个子类中有N个记录,那么这个子类的聚类特征就是

CF=(N,LS,SS),其中LS是N个点(记录)的直线相加,SS是N个点的平方和相加。

一个聚类特征本质上是对于给定的子类的统计和,它记录了衡量一个子类的最关键的部分,用存储统计值代替了存储整个类的记录,提高了存储的效率。

一个聚类特征树是一个垂直平衡树,它为一个层次聚类存了各个步骤的聚类特征。图8.6给出了一个例子,我们约定一个“非叶子节点”是有“孩子”的,这个“非叶子节点”记录了它的孩子的聚类特征。一个聚类特征有两个变量——“分枝要素B”和“门限T”,B限定了每个“非叶子节点”最多含有的孩子的个数,T限定了存在叶节点的子类的最大半径,这两个参数影响了最后产生的树的大小。

那么“Birch”是怎样工作的呢?1,它扫描整个数据库一次,建立一个初始化的聚类特征树。2,它用一个聚类算法来聚合这些叶节点。

在第一阶段,聚类特征树随着记录一个一个的加入而自动形成的:一个记录被放入那个离它最近的叶节点(类)中去。如果放入以后这个子类的半径大于门限值T的话,那么这个叶节点就会被分割。这个放入的信息也会传递到根节点中去。聚类特征树的大小可以通过调节参数来改变,如果要存储的树需要的内存超过了主内存,那就要减小门限值重新建立一棵树,这个重建过程并不需要将整个记录扫描一次。而是建立在老的树的叶节点的基础之上的。因此,建立一个树记录需要被扫描一次,此外还有一些方法进一步扫描记录以提高聚类特征树的质量,当树建好以后,我们可以在第二阶段用其他的聚类算法了。

Birch算法用可利用的资源产生最好的聚类,给定一限定的主内存,一个很重要的考虑是尽量减少从I/O请求所需要的时间。Birch算法用了多种聚类的技术,对数据库的一次扫描产生一个基本好的聚类,一次或者更多的附加扫描能够提高聚类的质量。

Birch的效果怎么样?由于每一个节点只能有一定数量的“孩子”,实际产生的聚类特征树并不是自然生成的聚类。而且,如果聚类生成的类不成球形的话,这种算法就运用得很好,因为它用半径或者直径来控制类的边界。

2,Cure:

大多数的算法或者只能用于球状类和有相似大小的类上面,或者无法解决特例的问题。Cure算法则能够解决这些问题。

Cure采用一种很新颖的层次聚类算法,这种方法是介于“基于中心”和“基于记录”的方法之间的。一定数量的记录被选中,而不是用中心或者一个记录来代替整个类。那些能代表这个类的几个记录,首先在一个类中选择几个较为分散的记录作为代表整个类的记录,然后用一个特别的Fraction将他们压缩到类的中心。在每一步,那些有最大相似度的类就会被合并。

由于用了多个记录来代表类,使得这种算法能够很好地对付非球状的的类以及一些例外的情况结构。那么,在大数据量的情况下能够在不牺牲聚类质量的情况下,对付大数据量进行得很好。

为了对付大数据量,Cure用了随机抽取和分割的方法:

1,选取有s个记录的采样。

2,将这s 个采样分割成p个部分,每个有s/p个记录。

3,将s个记录分成s/pq个类。

4,通过随机采样去除那些特例的情况。

5,将这些类进行聚类,

五,基于密度的方法:

1,DBSCAN:

这个方法将密度足够大的那部分记录组成类,这儿定义了几个新的名词:

1,对于给定的记录,我们称在其半径e范围内的一个记录为这个记录的e-邻居。

2,如果一个记录的e-邻居个数超过一个最小值,MinPts那么我们就将这个记录称做中心记录。

3,一个记录的集合D,我们说一个记录p是记录q的“Directly density-reachable”记录,如果p是q的e-邻居,`并且q是个中心记录。

4,对于这样的一个链p1,p2,…pn,如果,p1=q,pn=p,且Pi+1是pi的“Directly density-reachable”,那么我们就将p称做q的“density-reachable”。

5,如果p,q都是一个记录o的“density-reachable”,那么就称p,q“density-connected”。

根据上面的定义,我们怎样来发现类呢?首先扫描一下数据库,计算每一个点(记录)的e-邻居的个数,如果一个记录的e-邻居的个数大于一个门限值,那么就将这个记录叫做中心记录,这样一个新的以这个记录为中心的类就产生了。接着,就寻找这个记录的所有的“density-reachable”记录,这个过程可能会将一些类也合并过,这个过程直到没有新的记录假如为止。

2,OPTICS:

虽然DBSCAN算法能够根据给定的参数e和MinPts来对记录进行聚类,但是这仍然由用户主观来选择参数,参数就影响了最终产生的类,实际上这也是很多聚集算法面临的问题。这些参数都是根据经验来取的,因此很难决定该选哪个,特别是对实际的,多属性的数据。大多数的算法对这些参数都是很敏感的,很小的一些差别就有可能导致大不相同的聚类结果。聚类结果。

为了解决这些问题,一个顺序聚类的方法“OPTICS”就被提出来了。再来看看DBSCAN,我们很容易就可以发现,对于给定的一个Min Pts值,那些参数e的值小的所得到的类一定完全包含在e值大的类当中了。注意一点这儿的e是一个距离(它是邻居半径)。因此,为了得到类的集合,我们设定了提供了距离参数的集合。为了同时建立不同的类,这些记录应该以一种顺序形式组织起来。这样我们就可以将e从小开始产生类了。基于这些理念,对于每一个记录都应该存储2个值——core-distance和reachability-distance:

core-distance:一个记录的core-distance是能使这个记录p成为中心记录的最小的e’值。如果p不是个中心记录,那么这个值就是未被定义。

reachability-distance(p,q):如果中心记录p和一个记录之间的距离小于e’,那么这个距离就是e’,其他的就是真实的距离。如果p 不是中心记录,它就没有被定义。

对于在数据库中的每一个记录,首先将它们编号,然后计算每个记录的这两个距离值。这就使得我们有足够的信息来在e小于等于e’的范围内得到很多的聚类结果了。

3,DENCLUE.

这个聚类方法主要基于下面的一些思想:

a,一个记录的影响力可以用一个数学函数来表示,叫做“影响函数”,这表明了一个记录对于其邻居记录的影响。

b,整个数据空间的密度可以用所有的记录的“影响函数”的总和来模化。

c,类可以通过确定“density attrator”来得到,这儿的“density attrator”是指在某个区域的最高峰。




### 聚类算法概述 聚类是指在一个已经完成初步聚类的基础上,针对特定需求或更细致的数据分析目的再次进行聚类的过程。这种方法能够帮助发现更加精细的模式和结构,尤其是在初次聚类未能充分揭示数据内部复杂关系的情况下。对于用户画像构建而言,在第一次聚类之后可能还需要进一步细分群体以便更好地理解不同子集之间的差异[^1]。 ```python from sklearn.cluster import KMeans import numpy as np def secondary_clustering(data, initial_clusters, n_secondary_clusters=3): """ 对初始聚类后的每个簇分别再做一次K-means聚类 参数: data (array-like): 输入数据矩阵. initial_clusters (list or array-like): 初始聚类结果标签列表. n_secondary_clusters (int): 每个初聚类中的次级聚类数量,默认为3. 返回: dict: 键为原始簇编号,值为对应的次级聚类标签数组. """ # 存储最终结果 final_labels = {} unique_initial_clusters = set(initial_clusters) for cluster_id in unique_initial_clusters: mask = np.array([c == cluster_id for c in initial_clusters]) subset_data = data[mask] kmeans = KMeans(n_clusters=n_secondary_clusters).fit(subset_data) labels = kmeans.labels_ final_labels[cluster_id] = labels return final_labels ``` ### 设计级标签体系 级标签体系是在原有基础上增加一层分类维度,使得描述更为具体化。例如,在广告推荐系统中,首次聚类可能会基于用户的年龄、性别等因素形成几个大致类别;而在第聚类时,则可以根据兴趣爱好等更具体的属性来进行划分,从而创建出如“年轻男性科技爱好者”这样的复合型标签。这不仅有助于提升个性化服务的效果,也能为企业提供更有价值的行为洞察。 ### 应用案例 在实际应用场景中,比如在线零售平台可以通过两次聚类来优化商品推荐机制: - **首轮聚类**:依据地理位置、购买频率等宏观因素将顾客分为若干大类; - **次轮聚类**:深入挖掘每一大类内的个体偏好,如服装风格倾向、品牌忠诚度等微观特性,进而制定更具针对性的商品推送方案。 这种多层次的客户分群方式能显著提高营销活动的成功率,并增强用户体验满意度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值