您的位置:

层次聚类分析

一、层次聚类分析概述

层次聚类分析是一种将数据对象分组的技术,它根据数据对象之间的相异度构造一棵树形结构,对于给定的数据集,聚类分析将其划分成若干个组或类以满足数据的规律性和可视化的需要。分为凝聚式层次聚类和分裂式层次聚类两种方法。凝聚式从每个样本自身作为一个类开始,逐步将样本类别合并,分裂式从整个样本集开始,逐步将样本分成两个部分。

在聚类过程中,最好的划分是使类别内部的相似程度最高,而类别之间的相似程度最低。衡量这两个相似程度常使用欧氏距离、曼哈顿距离、闵可夫斯基距离等距离度量。

层次聚类应用非常广泛,如生物学、社会学等领域都应用了层次聚类手段。

二、凝聚式层次聚类

凝聚式层次聚类是另一种聚类方法,最开始每个样本自己一个类,样本之间的距离通过计算两个类之间的连线得到,将距离最近的两个类合并为一个类,更新距离矩阵。依次重复这个过程,直到所有样本被合并到一个类中。这个过程可以用一棵树表示,被称为树状图( Dendrogram)。

from scipy.cluster.hierarchy import dendrogram, linkage
import numpy as np
import matplotlib.pyplot as plt

#生成数据
np.random.seed(1)
n = 100
t1 = np.random.normal(loc=10, scale=2, size=(n, 2))
t2 = np.random.normal(loc=3, scale=1, size=(n, 2))
data = np.vstack([t1, t2])

#层次聚类过程
Z = linkage(data, method='ward', metric='euclidean')

#获取树状图
plt.figure(figsize=(16, 9))
dendrogram(Z)
plt.show()

三、分裂式层次聚类

分裂式层次聚类是另一种聚类方法,最开始所有样本都在一个类中,样本之间的距离通过计算此类的方差来得到。将该类拆分为两个类,使得拆分后的类内方差之和最小。依次重复这个过程,直到每个样本分别成为一个类为止。

from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt

#生成数据
X, y = make_moons(n_samples=300, noise=0.05, random_state=0)

#层次聚类过程
model = AgglomerativeClustering(n_clusters=2)
model.fit(X)

#可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap='viridis')
plt.show()    

四、优缺点

层次聚类分析可以直观描述聚类过程,可以生成树状图和热力图,有利于对聚类结果的解释和可视化;同时因为算法本身没有目标函数,对初始结果高度敏感,计算复杂度很高,对大型数据集不适用。

五、总结

层次聚类分析是一种基本而重要的聚类方法,常用于数据挖掘、统计学、生物信息、模式识别、社会网络分析等领域,在分析大型数据和模式发现上取得了积极的应用结果。在处理公司、商业、政策、数据分析和学术研究等方面也有一定的应用。