令采用d_max的AGNES 算法一直执行到所有样本出现在同一 个簇( k=1), 可得"树状图" (dendrogram) ,其中每层链接一组聚类簇. 在树状图的特定层次上进行分割,则可得到相应的簇划分结果(虚线包含7个聚类簇).用西瓜数据集进行实现agnes的代码
时间: 2024-02-18 21:04:15 浏览: 118
好的,以下是使用Python实现AGNES算法进行聚类的代码,使用的数据集为西瓜数据集:
```python
import pandas as pd
import numpy as np
import math
import matplotlib.pyplot as plt
# 载入数据集
data = pd.read_csv('watermelon.csv')
X = data.iloc[:, 1:3].values
m = X.shape[0] # 样本数
# 计算距离矩阵
dis_mat = np.zeros((m, m))
for i in range(m):
for j in range(i+1, m):
dis_mat[i, j] = dis_mat[j, i] = np.linalg.norm(X[i]-X[j])
# AGNES聚类算法
def agnes(d_max):
# 初始化各样本为一个簇
cls = [[i] for i in range(m)]
# 初始化距离最小的两个簇
c1, c2 = 0, 1
# 初始化簇与簇之间的距离
min_dis = dis_mat[c1, c2]
# 构建距离矩阵
for k in range(m-1):
# 每次找到距离最小的两个簇
for i in range(len(cls)):
for j in range(i+1, len(cls)):
if len(cls[i]) > 1 and len(cls[j]) > 1:
tmp_dis = np.mean(dis_mat[np.ix_(cls[i], cls[j])])
if tmp_dis < min_dis:
c1, c2 = i, j
min_dis = tmp_dis
# 若最小距离大于d_max,则停止合并
if min_dis > d_max:
break
# 合并两个簇
cls[c1] += cls[c2]
# 删除已合并的簇
cls.pop(c2)
# 更新距离矩阵
for i in range(len(cls)-1):
if i == c1:
dis_mat[i, c1] = dis_mat[c1, i] = 0
else:
tmp_dis = np.mean(dis_mat[np.ix_(cls[i], cls[c1])])
dis_mat[i, c1] = dis_mat[c1, i] = tmp_dis
# 重置c1和c2
c1, c2 = 0, 1
# 重置min_dis
min_dis = dis_mat[c1, c2]
return cls
# 绘制聚类结果
def plot_cluster(cls):
colors = ['r', 'g', 'b', 'y', 'c', 'm', 'k']
for i in range(len(cls)):
for j in cls[i]:
plt.scatter(X[j, 0], X[j, 1], c=colors[i], marker='o')
plt.show()
if __name__ == '__main__':
d_max = 0.4 # 设定最大距离
cls = agnes(d_max)
plot_cluster(cls)
```
在上述代码中,首先载入了西瓜数据集,并计算了样本之间的距离矩阵。然后,定义了AGNES聚类算法的函数,其主要思路是不断合并距离最近的两个簇,直到合并后最小距离大于预设的最大距离d_max为止。最后,将聚类结果可视化。
阅读全文