共计 2051 个字符,预计需要花费 6 分钟才能阅读完成。
背景分析
传统 K -Means 算法在高维数据聚类中存在几个明显缺陷:

- 需要预先指定聚类数量 K,而实际场景中 K 往往未知
- 对初始质心选择敏感,容易陷入局部最优
- 假设聚类呈球形分布,难以处理复杂结构数据
AP 聚类的优势在于:
- 自动确定聚类数量,无需预设 K 值
- 以数据点间的相似度作为输入,适应任意形状的分布
- 将每个数据点视为潜在聚类中心,通过消息传递找出最佳代表点
原理解析
AP 聚类通过两种消息的迭代更新完成聚类:
- 责任度(responsibility)r(i,k):表示点 i 对点 k 作为其代表的累积证据
$$r(i,k) \leftarrow s(i,k) – \max_{k’ \neq k}{a(i,k’) + s(i,k’)}$$
- 可用度(availability)a(i,k):反映点 k 适合作为点 i 代表的累积证据
$$a(i,k) \leftarrow \min{0, r(k,k) + \sum_{i’ \notin {i,k}}\max(0,r(i’,k))}$$
迭代过程可形象理解为 ” 竞选 ”:
– 责任度:选民给候选人投票
– 可用度:候选人宣布获胜信心
Python 实现
# 环境准备
import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn import metrics
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(42)
X = np.vstack([np.random.normal(loc=(1,1), scale=0.3, size=(50,2)),
np.random.normal(loc=(5,5), scale=0.3, size=(50,2)),
np.random.normal(loc=(8,1), scale=0.3, size=(50,2))
])
# AP 聚类实现
def ap_cluster(X, preference=None, damping=0.5):
try:
model = AffinityPropagation(
preference=preference,
damping=damping,
random_state=42
).fit(X)
# 输出聚类结果
clusters = model.cluster_centers_indices_
labels = model.labels_
n_clusters = len(clusters)
print(f'发现聚类数量: {n_clusters}')
print(f'轮廓系数: {metrics.silhouette_score(X, labels):.3f}')
# 可视化
plt.figure(figsize=(10,6))
colors = plt.cm.rainbow(np.linspace(0,1,n_clusters))
for k, col in zip(range(n_clusters), colors):
members = labels == k
plt.scatter(X[members,0], X[members,1], color=col, marker='.')
plt.scatter(X[clusters[k],0], X[clusters[k],1], color=col,
marker='o', s=100, linewidths=2, edgecolor='k')
plt.title(f'AP 聚类结果 (K={n_clusters})')
plt.show()
return model
except Exception as e:
print(f'聚类失败: {str(e)}')
return None
# 执行聚类
model = ap_cluster(X, preference=-50)
参数调优
关键参数解析:
- preference:控制成为聚类中心的倾向
- 值越大,聚类中心越多
-
设为 None 时使用数据相似度的中位数
-
damping factor:防止数值震荡
- 范围(0.5,1),值越大收敛越慢但更稳定
- 默认 0.5 适用于多数场景
调优建议:
- 先用少量样本测试参数范围
- 结合轮廓系数评估聚类质量
- 对高维数据可先降维再调参
性能优化
应对大规模数据的技巧:
-
使用稀疏矩阵存储相似度
from scipy.sparse import csr_matrix S_sparse = csr_matrix(S) # S 为相似度矩阵 -
分批次计算相似度
- 按特征维度分块计算
-
使用近似最近邻 (ANN) 加速
-
内存优化
- 设置
copy=False避免数据复制 - 使用
joblib并行计算
避坑指南
常见问题解决方案:
- 震荡不收敛
- 增大 damping factor
-
设置最大迭代次数
max_iter -
聚类数量不合理
- 调整 preference 参数
-
检查相似度矩阵计算是否正确
-
内存不足
- 使用稀疏矩阵
- 采样部分数据确定参数
开放性问题
当面对千万级样本时,AP 聚类算法面临的主要挑战是 O(N^2)的内存和计算复杂度。可能的改进方向包括:
- 开发分布式消息传递机制
- 基于局部敏感哈希 (LSH) 的近似计算
- 分层聚类策略:先粗聚类再局部优化
期待读者在实践中探索这些方案的可行性。
正文完
