📅  最后修改于: 2023-12-03 15:26:32.980000             🧑  作者: Mango
层次聚类(hierarchical clustering)是机器学习中一种常见的聚类算法,它的目标是将一组数据分成若干个类别,让同一类别的数据尽可能相似,不同类别的数据尽可能不同。
层次聚类的基本思路是不断地将数据从上往下划分成若干个子集,直到每个子集只包含一个数据。这个过程可以用一棵树来表示,树的每个节点代表一个子集,可以是单个数据,也可以是多个数据的聚合。树的边则表示子集之间的相似度,通常使用距离来度量相似度。因此,层次聚类的核心任务是计算两个子集之间的距离。
层次聚类可分为两大类:凝聚型和分裂型。
凝聚型聚类:从上往下不断将数据聚合成更大的组别,直到所有数据最终都被聚合在一起,形成一棵树状结构。这种聚类方法比较适合数据分散的情况。
分裂型聚类:从上往下将所有数据包含的最小子集不断分裂成更小的组别,直到所有数据都被分裂成单独的一组。这种聚类方法比较适合聚类结果数已知或者固定的情况。
对于凝聚型聚类,一般采用自下而上的聚类方法,即先将每个数据单独分为一组,然后一步步将这些组合并成更大的组,直到所有数据最终都被合并到同一个组里。
以下是一段采用Python实现的层次聚类代码片段。
import numpy as np
from scipy.spatial.distance import pdist, squareform
def hierarchical_clustering(X):
"""
层次聚类算法实现
:param X: 输入数据(numpy数组)
:return: 聚类树(ndarray)和聚类标签(ndarray)
"""
# 计算距离矩阵,并转换成方阵
D = squareform(pdist(X))
# 初始化一个聚类数组,每个点都是一个聚类
clusters = np.arange(len(X)).reshape(-1, 1)
# 构造一个列表,用来存储聚类过程中的距离和组别信息
linkage_list = []
# 迭代合并聚类
while len(clusters) > 1:
# 计算当前状态下距离最小的两个聚类
i, j = np.unravel_index(np.argmin(D), D.shape)
# 记录两个聚类之间的距离和组别信息
linkage_list.append([i, j, D[i, j], len(clusters)])
# 合并这两个聚类
clusters[i] = np.hstack((clusters[i], clusters[j]))
clusters = np.delete(clusters, j, axis=0)
# 更新距离矩阵
D = np.delete(D, j, axis=0)
D = np.delete(D, j, axis=1)
new_row = np.min((D[i], D[j]), axis=0)
D[i] = new_row
D[:, i] = new_row
# 将聚类信息转换成标签
labels = np.zeros(len(X))
for i, cluster in enumerate(clusters):
labels[cluster] = i
return np.array(linkage_list), labels
该代码实现了一个基本的层次聚类算法,输入为原始数据矩阵X,输出为聚类树和聚类标签。
层次聚类的核心任务是计算两个子集之间的距离,常用的距离度量包括欧氏距离、曼哈顿距离、余弦相似度等。另外,层次聚类的聚类结果通常需要通过树形图来展示,树形图的横轴表示数据,纵轴表示距离,结点高度表示距离。层次聚类是机器学习中非常常用的聚类算法,应用广泛。