1. 近邻传播聚类算法(AP算法)概述
近邻传播聚类算法(Affinity Propagation, AP)是一种基于消息传递的聚类算法,由Frey和Dueck于2007年在Science杂志上首次提出。与传统聚类方法相比,AP算法最大的特点是不需要预先指定聚类数目,而是通过数据点之间的"消息传递"自动确定最佳聚类中心和聚类数量。
这个算法特别适合以下场景:
- 数据集的真实聚类数量未知
- 需要快速找到代表性样本作为聚类中心
- 处理中等规模数据集(数千到数万个样本点)
注意:AP算法的时间复杂度为O(N²T),其中N是样本数量,T是迭代次数。对于超大规模数据集,可能需要考虑其他更高效的聚类方法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AP算法核心原理解析
2.1 相似度矩阵构建
AP算法的第一步是计算所有数据点之间的相似度矩阵S。通常使用负欧氏距离作为相似度度量:
matlab复制% 计算相似度矩阵示例
function S = calculateSimilarity(X)
n = size(X,1);
S = zeros(n,n);
for i = 1:n
for j = 1:n
S(i,j) = -sum((X(i,:)-X(j,:)).^2);
end
end
end
相似度矩阵的对角线元素s(k,k)称为"偏好参数"(preference),它决定了数据点k成为聚类中心的可能性。通常可以设置为所有相似度的中位数或最小值。
2.2 消息传递机制
AP算法通过两种消息在数据点之间传递:
- 责任度(responsibility)r(i,k):从点i发送到候选中心k,反映k适合作为i的聚类中心的程度
- 可用度(availability)a(i,k):从候选中心k发送到点i,反映k适合作为i的聚类中心的累积证据
这两种消息的更新公式为:
code复制r(i,k) = s(i,k) - max{a(i,k')+s(i,k')} (k'≠k)
a(i,k) = min{0, r(k,k) + Σmax{0,r(i',k)}} (i'≠i,k)
2.3 聚类中心确定
在每次迭代后,可以通过计算每个点的"责任度+可用度"来确定聚类中心:
matlab复制[~, exemplars] = max(r + a, [], 2);
3. MATLAB实现详解
3.1 基础实现代码
以下是AP算法的基本MATLAB实现框架:
matlab复制function [idx, centers] = APCluster(X, maxits, convits, dampfact)
% 输入参数:
% X - 数据矩阵(n×d)
% maxits - 最大迭代次数
% convits - 收敛检查次数
% dampfact - 阻尼系数(0.5-1)
n = size(X,1);
S = calculateSimilarity(X); % 计算相似度矩阵
R = zeros(n,n); % 初始化责任度矩阵
A = zeros(n,n); % 初始化可用度矩阵
for iter = 1:maxits
% 更新责任度
oldR = R;
AS = A + S;
[Y,I] = max(AS,[],2);
for i = 1:n
AS(i,I(i)) = -inf;
end
[Y2,I2] = max(AS,[],2);
R = S - repmat(Y,[1,n]);
for i = 1:n
R(i,I(i)) = S(i,I(i)) - Y2(i);
end
R = (1-dampfact)*R + dampfact*oldR; % 阻尼更新
% 更新可用度
oldA = A;
Rp = max(R,0);
Rp(1:n+1:end) = R(1:n+1:end);
A = repmat(sum(Rp,1),[n,1]) - Rp;
dA = diag(A);
A = min(A,0);
A(1:n+1:end) = dA;
A = (1-dampfact)*A + dampfact*oldA; % 阻尼更新
% 检查收敛
if iter > convits
[~,exemplars] = max(R+A,[],2);
if all(exemplars == old_exemplars)
break;
end
end
old_exemplars = exemplars;
end
% 提取聚类结果
[~, centers] = max(R+A,[],2);
[~,~,idx] = unique(centers);
end
3.2 参数调优技巧
-
偏好参数(preference)设置:
- 通常设为相似度矩阵的中位数:
p = median(S(:)) - 值越大,聚类中心越多;值越小,聚类中心越少
- 通常设为相似度矩阵的中位数:
-
阻尼系数(damping factor):
- 范围0.5-1,默认0.5
- 值越大收敛越慢但更稳定
-
最大迭代次数:
- 通常100-500次足够
- 可通过观察R+A矩阵的变化判断是否收敛
4. 实际应用案例
4.1 二维数据聚类
matlab复制% 生成测试数据
rng(1);
X = [randn(100,2)*0.5+1; randn(100,2)*0.5-1];
figure; scatter(X(:,1),X(:,2)); title('原始数据');
% 运行AP聚类
[idx, centers] = APCluster(X, 100, 10, 0.7);
% 可视化结果
figure;
gscatter(X(:,1),X(:,2),idx);
hold on;
plot(X(centers,1),X(centers,2),'kx','MarkerSize',12,'LineWidth',2);
title('AP聚类结果');
4.2 图像颜色量化
AP算法可用于图像颜色压缩,将相似颜色聚类:
matlab复制% 读取图像
img = imread('peppers.png');
X = double(reshape(img,[],3)); % 将图像转为n×3矩阵
% 运行AP聚类(使用颜色距离作为相似度)
[idx, centers] = APCluster(X, 200, 15, 0.6);
% 重建图像
quantized_img = reshape(centers(idx,:), size(img));
figure;
subplot(1,2,1); imshow(img); title('原始图像');
subplot(1,2,2); imshow(uint8(quantized_img));
title(['压缩为',num2str(length(unique(idx))),'种颜色']);
5. 常见问题与解决方案
5.1 算法不收敛
现象:迭代达到最大次数仍未收敛
解决方法:
- 增加阻尼系数(0.7-0.9)
- 检查相似度矩阵是否有异常值
- 调整偏好参数,可能设置过高或过低
5.2 聚类中心过多/过少
控制技巧:
- 通过调整偏好参数控制聚类数量
- 使用以下公式自动设置偏好参数:
matlab复制p = min(S(:)) + (max(S(:))-min(S(:)))*k; % k∈[0,1]
5.3 内存不足问题
对于大型数据集:
- 使用稀疏矩阵存储相似度
- 考虑采样或分块处理
- 改用更高效的实现(如C++扩展)
6. 性能优化技巧
-
矩阵运算优化:
- 使用MATLAB的向量化操作替代循环
- 预分配所有矩阵内存
-
并行计算:
matlab复制parfor i = 1:n % 并行计算部分 end -
早期停止:
- 设置合理的收敛判断条件
- 监控目标函数变化
-
近似计算:
- 对远距离点对使用近似相似度
- 采用子采样策略
我在实际使用中发现,AP算法对参数设置比较敏感,特别是偏好参数的选择会显著影响聚类结果。一个实用的技巧是先用小规模子样本测试参数,然后再应用到整个数据集。另外,对于高维数据,建议先进行PCA降维处理,这能大幅提高算法的效率和稳定性。
