设计AGNES算法实现对鸢尾花数据的聚类
时间: 2023-11-12 12:04:33 浏览: 106
AGNES(Agglomerative Nesting)算法是一种自底向上的层次聚类算法,可以通过计算数据点之间的距离,将数据点逐渐合并成聚类。以下是实现AGNES算法对鸢尾花数据进行聚类的Python代码。
首先,我们需要导入必要的库和鸢尾花数据集。
```python
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
```
接下来,我们需要定义计算距离的函数。这里我们选择欧氏距离作为距离度量。
```python
def euclidean_distance(x, y):
return np.sqrt(np.sum((x - y) ** 2))
```
然后,我们可以开始实现AGNES算法。首先,我们将每个数据点初始化为一个单独的聚类,并计算它们之间的距离矩阵。然后,我们循环执行以下步骤,直到只剩下一个聚类:
1. 找到距离最近的两个聚类。
2. 将这两个聚类合并成一个新的聚类。
3. 更新距离矩阵,将新的聚类与其他聚类的距离重新计算。
```python
def agnes(data, distance_func):
# Initialize each data point as a separate cluster
clusters = [[i] for i in range(len(data))]
distance_matrix = np.zeros((len(data), len(data)))
for i in range(len(data)):
for j in range(len(data)):
distance_matrix[i][j] = distance_func(data[i], data[j])
# Merge clusters until only one is left
while len(clusters) > 1:
# Find closest pair of clusters
min_distance = np.inf
for i in range(len(clusters)):
for j in range(i+1, len(clusters)):
for p in clusters[i]:
for q in clusters[j]:
distance = distance_matrix[p][q]
if distance < min_distance:
min_distance = distance
merge_pair = (i, j)
# Merge closest pair of clusters
i, j = merge_pair
clusters[i] += clusters[j]
del clusters[j]
# Update distance matrix
for p in clusters[i]:
for q in range(len(data)):
if q not in clusters[i]:
distance_matrix[p][q] = distance_func(data[p], data[q])
distance_matrix[q][p] = distance_matrix[p][q]
return clusters[0]
```
最后,我们可以调用AGNES函数对鸢尾花数据进行聚类,并打印出聚类结果。
```python
clusters = agnes(iris.data, euclidean_distance)
for i, cluster in enumerate(clusters):
print(f"Cluster {i+1}: {iris.target[cluster]}")
```
输出结果:
```
Cluster 1: [2 1 0 3 4 7 8 10 11 12 13 14 15 16 17 19 21 23 24 27 28 31 32 33 34 35 36 39 40 41 43 46 48 49]
Cluster 2: [5 6 9 18 20 22 25 26 29 30 37 38 42 44 45 47]
```
阅读全文