目录
一、层次聚类概述
二、凝聚法(Agglomerative Clustering)
1. 初始化
2. 计算距离
3. 合并簇
4. 重复迭代
三、分裂法(Divisive Clustering)
1. 初始化
2. 分裂簇
3. 分配样本点
4. 重复迭代
四、其他考虑因素
五、总结
六、代码
七、运行结果
一、层次聚类概述
层次聚类是一种无监督学习算法,它通过分析数据点之间的相似性或距离来构建层次化的聚类结构。这种聚类方法能够展示数据集的内在层次关系,为理解数据的复杂结构提供有力工具。
二、凝聚法(Agglomerative Clustering)
1. 初始化
在凝聚法中,每个数据点最初都被视为一个单独的簇。这意味着,如果有n个数据点,那么初始时就有n个簇。
2. 计算距离
接下来,算法需要计算各簇之间的距离。常用的距离度量方式包括最小距离(单链接)、最大距离(全链接)和平均距离(平均链接)。
- 最小距离(单链接):
其中,和 是两个簇,x 和 z 分别是这两个簇中的样本点,dist(x,z) 是样本点 x 和 z 之间的距离(通常使用欧氏距离)。最小距离由两个簇中最近的样本点决定。
-
最大距离(全链接):
最大距离由两个簇中最远的样本点决定。 -
平均距离(平均链接):
平均距离由两个簇中所有样本点共同决定,其中 和 分别是簇 和 的样本数。
3. 合并簇
在计算出各簇之间的距离后,算法会选择距离最近的两个簇进行合并。合并后的新簇将包含原来两个簇的所有样本点,并作为一个新的簇参与后续的计算。
4. 重复迭代
算法将重复执行计算距离和合并簇的步骤,直到所有数据点都被合并成一个簇,或者达到预设的聚类数目。在每一步迭代中,聚类树都会增加一层,展示当前的数据聚类状态。
三、分裂法(Divisive Clustering)
分裂法与凝聚法相反,它从一个包含所有数据点的大簇开始,逐步分裂成更小的簇。
1. 初始化
将所有数据点归为一个簇。
2. 分裂簇
在簇内部,算法会计算任意两个样本点之间的距离,并找到距离最远的两个样本点。这两个样本点将被视为两个新的聚类中心,原簇将被分裂成两个子簇。
3. 分配样本点
接下来,算法会计算原簇中剩余样本点到这两个新聚类中心的距离,并将每个样本点归入离其最近的一个聚类中心所对应的子簇中。
4. 重复迭代
算法将重复执行分裂簇和分配样本点的步骤,直到每个簇只包含一个数据点,或者达到预设的聚类数目。在每一步迭代中,聚类树都会减少一层,展示数据的逐步分裂过程。
四、其他考虑因素
- 距离度量:除了上述的欧氏距离外,还可以使用其他距离度量方式(如曼哈顿距离、余弦距离等)来计算样本点之间的距离。
- 停止条件:除了预设的聚类数目外,还可以根据其他条件(如簇间距离阈值、聚类质量评估指标等)来停止聚类过程。
- 优化算法:由于层次聚类的计算量较大,特别是对于大规模数据集,因此可能需要采用一些优化算法(如采样、近似计算等)来提高计算效率。
五、总结
层次聚类通过构建层次化的聚类结构来展示数据的内在关系。凝聚法和分裂法是层次聚类的两种主要策略,它们分别通过合并和分裂簇来
六、代码
import pandas as pd
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 步骤1: 读取数据
df = pd.read_excel('dataset.xlsx')
# 只使用数值型特征进行聚类
# 筛选出数值型列
numeric_columns = df.select_dtypes(include=['int64', 'float64']).columns
data = df[numeric_columns].values
# 步骤2: 数据预处理(进行标准化)
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# 步骤3: 应用层次聚类
# 使用ward方法,可以尝试其他方法如'single', 'complete', 'average', 'centroid', 'median', 'ward'
linked = linkage(data_scaled, 'ward')
# 步骤4: 可视化dendrogram并保存为高清PNG
plt.figure(figsize=(10, 7), dpi=2000) # 设置高DPI以获得更高的图像质量
# 使用简单的索引作为标签(如果样本数不多)
if len(data_scaled) <= 100: # 只在样本数不多时显示标签
labels = range(len(data_scaled))
else:
labels = None # 如果样本数很多,则不显示标签
dendrogram(linked,
orientation='top',
labels=labels, # 使用简单的索引或None
distance_sort='descending',
show_leaf_counts=True)
plt.title('Dendrogram of Hierarchical Clustering')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.tight_layout() # 避免标签和标题与图形重叠
plt.savefig('dendrogram_high_res.png', dpi=2000) # 保存高清图像
plt.show() # 显示图像
七、运行结果
图3-1 树状图