层次聚类算法伪码和matlab算法

1. 层次聚类

层次聚类算法与之前所讲的顺序聚类有很大不同,它不再产生单一聚类,而是产生一个聚类层次。说白了就是一棵层次树。介绍层次聚类之前,要先介绍一个概念——嵌套聚类。讲的简单点,聚类的嵌套与程序的嵌套一样,一个聚类中R1包含了另一个R2,那这就是R2嵌套在R1中,或者说是R1嵌套了R2。具体说怎么算嵌套呢?聚类R1={{x1,x2},{x3},{x4,x5}嵌套在聚类R2={{x1,x2,x3},{x4,x5}}中,但并不嵌套在聚类R3={{x1,x4},{x3},{x2,x5}}中。

层次聚类算法产生一个嵌套聚类的层次,算法最多包含N步,在第t步,执行的操作就是在前t-1步的聚类基础上生成新聚类。主要有合并和分裂两种实现。我这里只讲合并,因为前一阶段正好课题用到,另外就是合并更容易理解和实现。当然分裂其实就是合并的相反过程。

g(Ci,Cj)为所有可能的X聚类对的函数,此函数用于测量两个聚类之间的近邻性,用t表示当前聚类的层次级别。通用合并算法的伪码描述如下:

1. 初始化:

a) 选择Â0={{x1},…,{xN}}

b) 令t=0

2. 重复执行以下步骤:

a) t=t+1

b) 在Ât-1中选择一组(Ci,Cj),满足

c) 定义Cq=CiÈCj,并且产生新聚类Ât=(Ât-1-{Ci,Cj})È{Cq}

直到所有向量全被加入到单一聚类中。

这一方法在t层时将两个向量合并,那么这两个向量在以后的聚类过程中的后继聚类都是相同的,也就是说一旦它们走到一起,那么以后就不会再分离……(很专一哦O(∩_∩)O~)。这也就引出了这个算法的缺点,当在算法开始阶段,若出现聚类错误,那么这种错误将一直会被延续,无法修改。在层次t上,有N-t个聚类,为了确定t+1层上要合并的聚类对,必须考虑(N-t)(N-t-1)/2个聚类对。这样,聚类过程总共要考虑的聚类对数量就是(N-1)N(N+1)/6,也就是说整个算法的时间复杂度是O(N3)。

举例来说,如果令X={x1x2x3x4x5},其中x1=[11]Tx2=[21]Tx3=[54]Tx4=[65]Tx5=[6.56]T。那么合并算法执行的过程可以用下面的图来表示。

     P(X)是不相似矩阵

该算法从核心过程上来讲,就是先计算出数据集中向量之间的距离,记为距离矩阵(也叫不相似矩阵)。接着通过不断的对矩阵更新,完成聚类。矩阵更新算法的伪码描述如下:

1. 初始化:

a) Â0={{x1},…,{xN}}

b) P0=P(X) (距离矩阵)

c) t=0

2. 重复执行以下步骤:

a) t=t+1

b) 合并CiCjCq,这两个聚类满足d(Ci,Cj)=minr,s=1,…,N,r≠sd(Cr,Cs)

c) 删除第i和j行,第i和j列,同时插入新的行和列,新的行列为新合并的类Cq与所有其他聚类之间的距离值

直到将所有向量合并到一个聚类中

大家可以看到,层次聚类算法的输出结果总是一个聚类,这往往不是我们想要的,我们总希望算法在得到我们期望的结果后就停止。那么我们如何控制呢?常用的做法就是为算法限制一个阈值,矩阵更新过程中,总是将两个距离最近的聚类合并,那么我们只要加入一个阈值判断,当这个距离大于阈值时,就说明不需要再合并了,此时算法结束。这样的阈值引入可以很好的控制算法结束时间,将层次截断在某一层上。

2. 算法实现

       MATLAB实现了层次聚类算法,基本语句如下:

1X = [1 2;2.5 4.5;2 2;4 1.5;4 2.5] ; 
2Y = pdist(X,'euclid');  
3Z = linkage(Y,'single');  
4T = cluster(Z,'cutoff',cutoff);

MATLAB还有一个简化的层次聚类版本,一句话搞定

1T = clusterdata(X,cutoff)

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
谱聚类(Spectral Clustering)是一种基于图论和线性代数的聚类算法,它将数据点的相似性转化为图的边权重,然后通过对图进行谱分解和聚类来实现数据点的划分。下面是谱聚类算法的简单Python伪码: 输入:数据集X,聚类数k,相似度矩阵W 1. 构建相似度矩阵W:根据数据集X,计算每对数据点之间的相似度,并构建相似度矩阵W。 2. 构建拉普拉斯矩阵L:计算拉普拉斯矩阵L,有多种方式可以计算,常用的有标准化的拉普拉斯矩阵和对称归一化的拉普拉斯矩阵。 3. 对L进行谱分解:对拉普拉斯矩阵L进行谱分解,得到特征值和对应的特征向量。 4. 特征向量归一化:将特征向量按行进行归一化,得到归一化后的特征向量矩阵U。 5. 使用k-means对U进行聚类:对归一化后的特征向量矩阵U进行k-means聚类,得到最终的聚类结果。 伪码中的步骤2和步骤3是谱聚类的核心步骤,它们通过特征值分解和特征向量归一化来实现数据点的降维和聚类。在实际的代码实现中,可以使用Python中的科学计算库(如NumPy、SciPy)和聚类库(如scikit-learn)来进行相似度矩阵的计算、矩阵操作和聚类算法的应用。 请注意,这只是谱聚类算法的简单伪码,实际的实现可能会涉及更多细节和优化。如果您需要详细了解谱聚类算法的实现,请参考相关文献或开源库中的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值