系统聚类概述
系统聚类,又称分层聚类法,是一种用于分析数据的统计方法,在生物学、分类学、社会网络等领域有广泛应用。以下是对系统聚类的详细概述:
一、基本思想
系统聚类的基本思想是将每个样品(或数据点)视为单独的类,然后基于它们之间的相似性(或距离)进行逐步合并或分裂,以构建一个层次结构的聚类结果。这种层次结构可用于分析数据的不同层次的相似性关系。
二、聚类方式
系统聚类主要包括两种基本的聚类方式:
- 凝聚聚类:从单个样本开始,不断将最相似的两个样本合并,形成一个新的聚类。这个过程一直持续到所有样本都被合并到一个聚类中为止。凝聚聚类的优点是在处理大数据时,计算复杂度相对较低;但其缺点是可能会导致聚类数量不准确,对噪声和异常值的敏感度较高。
- 分裂聚类:从所有样本开始,不断将最不相似的两个样本分开,形成一个新的聚类。这个过程一直持续到所有样本都被分到不同的聚类中为止。分裂聚类的优点是聚类数量比较准确,对噪声和异常值的影响较小;但其缺点是在处理大数据时,计算复杂度较高。
三、距离与相似度度量
在系统聚类中,类与类之间的距离有多种定义方法,常见的包括:
- 最短距离法:类与类之间的距离等于两类最近样品之间的距离。
- 最长距离法:类与类之间的距离等于两类最远样品之间的距离。
- 类平均法:类与类之间的距离等于各类元素两两之间的平方距离的平均。
- 重心法:类与类之间的距离定义为对应这两类重心之间的距离。对样品分类来说,每一类的类重心就是该类样品的均值。
- 中间距离法:介于最短距离法和最长距离法之间的一种方法,既不考虑最近距离,也不考虑最远距离,而是采用介于最远和最近之间的距离。
- 离差平方和法(Ward法):基于方差分析的思想,如果分类正确,同类样品之间的离差平方和应当较小,类与类之间的离差平方和应当较大。
此外,常用的空间距离度量还包括绝对值距离、欧氏距离、切比雪夫距离、马氏距离和兰氏距离等。
四、聚类过程与结果
系统聚类的过程通常包括以下几个步骤:
- 定义以变量或指标的个数为维度的空间里的一种距离。
- 计算所有样本两两之间的距离。
- 将每个样本归为一类,根据计算出的样本间的距离合并距离最近的两类为一个新类。
- 再计算新类与其他各类的距离,并根据计算出的距离合并距离最近的两类为一个新类。
- 循环以上过程直至类别个数为1或达到其他停止条件。
最终,系统聚类会生成一个层次结构的聚类结果,可以通过聚类图(或称为树状图、谱系图)直观地展示。研究者可以根据聚类图决定将数据分为多少类,并深入分析数据的结构和组织。
五、应用与优势
系统聚类在多个领域都有广泛应用,如生物学中的物种分类、市场细分中的客户群划分、文本挖掘中的主题识别等。其优势在于能够构建层次结构的聚类结果,为研究者提供了对数据结构和组织的更深层次的认识。同时,通过选择不同的相似度或距离度量方式以及聚类算法,可以得到不同的聚类结果,以满足不同领域和问题的需求。
综上所述,系统聚类是一种灵活且强大的聚类分析方法,适用于多个领域的数据分析和挖掘任务。
系统聚类方法比较
本文使用Python对不同系统聚类的结果进行比较分析。
数据读取
#不同系统聚类法的比较
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage, ward
#创建数据
index=['A','B','C','D','E']
X1=[6901.6,8467.3,5067.7,5777.3,5975.7]
X2=[2321.3,1903.9,1746.6,1776.9,1963.5]
X3=[4632.8,7385.4,3753.4,3752.6,3809.4]
X4=[1558.2,1420.7,1430.2,1329.1,1322.1]
X5=[3447.0,5100.9,1993.8,2517.9,3064.3]
X6=[3018.5,3452.3,2078.8,2322.1,2352.9]
X7=[2313.6,1691.9,1524.5,1583.4,1750.4]
X8=[802.8,645.3,492.8,479.9,614.9]
X=np.array([X1,X2,X3,X4,X5,X6,X7,X8]).T
Python绘制谱系图
#%%
#最短距离法
model=AgglomerativeClustering(n_clusters=3,linkage='single')
#linkage='single'表示最短距离法
model.fit(X)
# #输出欧式距离
# print(model.children_)
# #输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(421)
plt.title('Single linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图
linkage_matrix=linkage(X,method='single',metric='euclidean')
plt.subplot(422)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()#最长距离法
model=AgglomerativeClustering(n_clusters=3,linkage='complete')
#linkage='complete'表示最长距离法
model.fit(X)
# #输出欧式距离
# print(model.children_)
# #输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(423)
plt.title('Complete linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图
linkage_matrix=linkage(X,method='complete',metric='euclidean')
plt.subplot(424)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()#重心法
model=AgglomerativeClustering(n_clusters=3,linkage='average')
#linkage='average'表示重心法
model.fit(X)
#输出欧式距离
# print(model.children_)
#输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(425)
plt.title('Average linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图
linkage_matrix=linkage(X,method='average',metric='euclidean')
plt.subplot(426)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()#类平均法
model=AgglomerativeClustering(n_clusters=3,linkage='ward')
#linkage='ward'表示类平均法
model.fit(X)
#输出欧式距离
# print(model.children_)
#输出聚类结果
# print(model.labels_)
#绘制聚类结果
plt.figure(figsize=(10,5))
plt.subplot(427)
plt.title('Ward linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#绘制谱系图欧氏距离衡量
linkage_matrix=linkage(X,method='ward',metric='euclidean')
plt.subplot(428)
#转换横坐标与纵坐标
dendrogram(linkage_matrix,labels=index,orientation='right')
plt.show()
一、最短距离法
二、最长距离法
三、重心法
四、类平均法
Python绘制聚类图
#最短距离法
model=AgglomerativeClustering(n_clusters=3,linkage='single')#linkage='single'表示最短距离法
model.fit(X)plt.figure(figsize=(10,5))
plt.subplot(221)
plt.title('Single linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#最长距离法
model=AgglomerativeClustering(n_clusters=3,linkage='complete')#linkage='complete'表示最长距离法
model.fit(X)plt.subplot(222)
plt.title('Complete linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])
plt.show()
#重心法
model=AgglomerativeClustering(n_clusters=3,linkage='average')#linkage='average'表示重心法
model.fit(X)plt.figure(figsize=(10,5))
plt.subplot(223)
plt.title('Average linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])#类平均法
model=AgglomerativeClustering(n_clusters=3,linkage='ward')#linkage='ward'表示类平均法
model.fit(X)plt.subplot(224)
plt.title('Ward linkage')
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap='rainbow')
for i in range(X.shape[0]):plt.text(X[i,0],X[i,1],index[i])
plt.show()