初级
第13章 无监督学习概论 - 实现层次聚类
未完成
初级参考
完整示例代码供参考,建议自己理解后重新输入
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
class AgglomerativeClustering:
def __init__(self, n_clusters=2):
self.n_clusters = n_clusters
self.labels = None
def fit(self, X):
n_samples = X.shape[0]
clusters = [[i] for i in range(n_samples)]
distances = np.zeros((n_samples, n_samples))
for i in range(n_samples):
for j in range(i+1, n_samples):
distances[i, j] = distances[j, i] = np.linalg.norm(X[i] - X[j])
np.fill_diagonal(distances, np.inf)
while len(clusters) > self.n_clusters:
min_dist = np.inf
merge_i, merge_j = 0, 0
for i in range(len(clusters)):
for j in range(i+1, len(clusters)):
cluster_dist = self._cluster_distance(X, clusters[i], clusters[j], distances)
if cluster_dist < min_dist:
min_dist = cluster_dist
merge_i, merge_j = i, j
clusters[merge_i].extend(clusters[merge_j])
clusters.pop(merge_j)
self.labels = np.zeros(n_samples, dtype=int)
for label, cluster in enumerate(clusters):
for idx in cluster:
self.labels[idx] = label
return self
def _cluster_distance(self, X, cluster1, cluster2, distances):
max_dist = 0
for i in cluster1:
for j in cluster2:
max_dist = max(max_dist, distances[i, j])
return max_dist
👑
升级 VIP
解锁全部题目,畅通无阻地学习
- ✓ 解锁全部训练包所有题目
- ✓ 查看完整参考代码和提示
- ✓ 浏览器内直接运行 Python 代码
- ✓ 自动批改 + 进度追踪
30天
¥18
1年
¥99
2年
¥158
3年
¥199