Python-层次聚类-Hierarchical clustering

本文介绍了一种层次聚类算法的实现方法,通过Python代码详细解释了如何从计算两两样本间的欧氏距离开始,逐步合并最近的簇直至达到指定数量的簇。层次聚类是一种不需要预先设定簇的数量的聚类方法,适用于探索性数据分析。

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

层次聚类关键方法
#coding:UTF-8
#Hierarchical clustering 层次聚类
from
E_distance import Euclidean_distance from yezi import yezi class bicluster: def __init__(self, vec, left=None,right=None,distance=0.0,id=None): self.left = left self.right = right #每次聚类都是一对数据,left保存其中一个数据,right保存另一个 self.vec = vec #保存两个数据聚类后形成新的中心 self.id = id self.distance = distance def hcluster(blogwords,n) : biclusters = [ bicluster(vec = blogwords[i], id = i ) for i in range(len(blogwords)) ] distances = {} flag = None; currentclusted = -1 while(len(biclusters) > n) : #假设聚成n个类 min_val = 999999999999; #Python的无穷大应该是inf biclusters_len = len(biclusters) for i in range(biclusters_len-1) : for j in range(i + 1, biclusters_len) : if distances.get((biclusters[i].id,biclusters[j].id)) == None: distances[(biclusters[i].id,biclusters[j].id)] = Euclidean_distance(biclusters[i].vec,biclusters[j].vec) d = distances[(biclusters[i].id,biclusters[j].id)] if d < min_val : min_val = d flag = (i,j) bic1,bic2 = flag #解包bic1 = i , bic2 = j newvec = [(biclusters[bic1].vec[i] + biclusters[bic2].vec[i])/2 for i in range(len(biclusters[bic1].vec))] #形成新的类中心,平均 newbic = bicluster(newvec, left=biclusters[bic1], right=biclusters[bic2], distance=min_val, id = currentclusted) #二合一 currentclusted -= 1 del biclusters[bic2] #删除聚成一起的两个数据,由于这两个数据要聚成一起 del biclusters[bic1] biclusters.append(newbic)#补回新聚类中心 clusters = [yezi(biclusters[i]) for i in range(len(biclusters))] #深度优先搜索叶子节点,用于输出显示 return biclusters,clusters
深度优先显示:
def
yezi(clust): if clust.left == None and clust.right == None : return [clust.id] return yezi(clust.left) + yezi(clust.right)
欧氏距离:
#
Euclidean_distance from math import sqrt def Euclidean_distance(vector1,vector2): length = len(vector1) TSum = sum([pow((vector1[i] - vector2[i]),2) for i in range(len(vector1))]) SSum = sqrt(TSum) return SSum

层次聚类算法:

给定要聚类的N的对象以及N*N的距离矩阵(或者是相似性矩阵), 层次式聚类方法的基本步骤(参看S.C. Johnson in 1967)如下:
  1. 将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.
  2. 找到最接近的两个类并合并成一类, 于是总的类数少了一个.
  3. 重新计算新的类与所有旧类之间的距离.
  4. 重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).

由于层次聚类计算量巨大,所以通常不用来计算大量的数据,不过可以用层次聚类来选取K-means算法的初始类中心。

例子(不规范,只是用来显示输入和输出的格式):

参考:http://www.cnblogs.com/coser/archive/2013/04/10/3013044.html

转载于:https://www.cnblogs.com/Key-Ky/p/3440684.html

### 关于头歌平台中的层次聚类相关内容 #### 头歌平台简介 头歌(TOOGOO)是一个专注于在线编程教育的平台,提供丰富的课程资源和技术实践环境。对于机器学习领域的内容,尤其是像层次聚类这样的算法,通常会通过理论讲解、代码实现以及实际案例分析的方式帮助用户掌握知识点。 #### 层次聚类算法概述 层次聚类是一种基于距离度量的方法,用于构建嵌套分组结构的数据表示形式[^2]。该算法可以分为凝聚型和分裂型两种主要类别。其中,凝聚型是从单个样本开始逐步合并成更大的簇;而分裂型则是从整体数据出发不断分割为更小的子集[^3]。 #### Python实现层次聚类的具体步骤 以下是利用`scipy`库完成层次聚类的一个典型流程: 1. **导入必要的模块** 需要引入`numpy`, `matplotlib.pyplot`, 和`scipy.cluster.hierarchy`等工具来支持数值计算、绘图功能以及具体的层次聚类操作。 2. **准备数据集** 可以创建人工合成的小规模二维点作为实验对象或者加载真实世界的大规模多维特征向量集合。 3. **执行层次聚类并绘制树状图** 使用`linkage()`函数生成连接矩阵,并调用`dendrogram()`显示直观的结果图形。 4. **提取最终划分方案** 应用`fcluster()`方法指定阈值参数从而得到离散化的标签分配结果。 下面给出一段完整的示范程序片段: ```python import numpy as np from scipy.cluster.hierarchy import dendrogram, linkage, fcluster import matplotlib.pyplot as plt # Step 1: Generate sample data points np.random.seed(0) X = np.random.rand(10, 2) # Step 2: Perform hierarchical clustering Z = linkage(X, 'ward') # Step 3: Plot the dendrogram plt.figure(figsize=(8, 6)) dn = dendrogram(Z) plt.title('Hierarchical Clustering Dendrogram') plt.xlabel('Sample Index') plt.ylabel('Distance (Ward)') plt.show() # Step 4: Extract cluster labels based on a threshold value t=1.5 clusters = fcluster(Z, t=1.5, criterion='distance') print("Cluster Labels:", clusters) ``` 此脚本展示了如何运用SciPy包来进行标准的层次聚类过程,并且包含了可视化的组件以便更好地理解所得结论的意义所在[^4]。 #### 注意事项 当在头歌平台上练习此类项目时,请注意以下几点建议: - 数据标准化处理的重要性不可忽视; - 不同链路准则的选择会对最终模型性能产生影响; - 合理设定停止条件能够有效控制过拟合现象的发生概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值