层次聚类Single Link (MIN) python代码 已插入数据的
时间: 2024-02-01 14:13:10 浏览: 59
以下是使用Python实现单链接层次聚类算法的示例代码:
```python
import numpy as np
# 定义距离函数
def distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
# 定义单链接层次聚类函数
def single_linkage_clustering(data):
n = data.shape[0] # 样本数量
labels = np.arange(n) # 初始化每个样本的标签
distances = np.zeros((n, n)) # 初始化距离矩阵
for i in range(n):
for j in range(i + 1, n):
distances[i][j] = distance(data[i], data[j]) # 计算样本之间的距离
distances[j][i] = distances[i][j]
for k in range(n - 1):
min_distance = np.inf
for i in range(n):
for j in range(i + 1, n):
if distances[i][j] < min_distance and labels[i] != labels[j]:
min_distance = distances[i][j]
index1, index2 = i, j
for i in range(n):
if labels[i] == labels[index2]:
labels[i] = labels[index1] # 更新标签
for j in range(n):
if j != index1 and j != index2:
distances[index1][j] = min(distances[index1][j], distances[index2][j])
distances[j][index1] = distances[index1][j]
distances[index1][index1] = 0
return labels
# 测试
data = np.array([[1, 2], [4, 5], [3, 4], [2, 2], [3, 5]])
labels = single_linkage_clustering(data)
print(labels)
```
其中,`distance`函数用于计算两个样本之间的欧氏距离;`single_linkage_clustering`函数实现了单链接层次聚类算法,接收一个`n×m`的二维数组`data`,其中`n`为样本数量,`m`为特征数量,返回一个长度为`n`的一维数组`labels`,表示每个样本所属的簇。代码中使用了一个`distances`矩阵来存储样本之间的距离,初始时全部为0,聚类过程中逐渐更新;使用一个`labels`数组来存储每个样本的标签,初始时每个样本的标签为其所在位置的索引。
阅读全文