在一维点集(1,4,9,16,25,36,49,64,81)上执行层次聚类方法,假定簇表示其质心,每次迭代中将最近的两个簇合并代码
时间: 2024-12-29 19:33:39 浏览: 24
在一维点集中,执行层次聚类(Hierarchical Clustering)通常采用单链接、全链接、平均链接或 ward's 等方法。这里假设我们使用的是最简单的单链接(最小边距),即每次合并距离最近的两个簇,簇的质心由其元素的均值计算。
以下是层次聚类的一个简化版本的 Python 代码示例,使用了 scipy 库的 linkage 函数:
```python
import numpy as np
from scipy.cluster.hierarchy import single
# 给定的一维点集数据
points = np.array([1, 4, 9, 16, 25, 36, 49, 64, 81])
# 将数据转换成二维数组,便于处理
points_2d = points.reshape(-1, 1)
# 计算单链路法的距离矩阵
dist_matrix = single(points_2d)
# 初始化簇列表
clusters = [[i] for i in range(len(points))]
# 双端堆用于存储簇对和它们之间的最小距离
heap = [(0, (0, len(clusters)-1))] # 初始堆只有一个节点,距离为0,包含所有点
while heap:
# 弹出最小距离的簇对
distance, (parent_cluster_idx, child_cluster_idx) = heap.pop(0)
# 合并这两个簇
parent_cluster = clusters[parent_cluster_idx]
child_cluster = clusters[child_cluster_idx]
new_cluster = [x for x in parent_cluster + child_cluster if x not in heap] # 避免重复添加
# 更新质心(这里简单地取平均值)
new_centroid = sum(new_cluster) / len(new_cluster)
# 用新的质心更新簇
new_cluster.append(new_centroid)
# 更新簇列表和堆
clusters[parent_cluster_idx] = new_cluster
heap.extend([(distance + abs(new_centroid - point), i) for i, point in enumerate(points_2d) if point not in heap]) # 添加剩余未处理的簇到堆
# 输出最终的簇及其质心
for i, cluster in enumerate(clusters):
print(f"簇 {i+1}: {cluster} (质心: {sum(cluster) / len(cluster)})")
```
这个代码会将点集逐步合并成更小的簇,并打印每个簇的信息。注意实际应用中可能需要调整细节,比如选择合适的距离度量等。
阅读全文