近邻传播聚类(AP)算法原理与MATLAB实现
1. 近邻传播聚类算法概述近邻传播聚类算法Affinity Propagation, AP算法是一种基于消息传递机制的聚类方法它通过数据点之间的相似度和责任度信息自动确定聚类中心和聚类数目。与传统聚类算法相比AP算法最大的优势在于不需要预先指定聚类数目算法能够自动识别数据中合适的聚类结构。我第一次接触AP算法是在处理一组客户行为数据时当时尝试了K-means、层次聚类等方法但都需要反复调整聚类数目参数。AP算法让我眼前一亮因为它能自动确定最佳聚类数这在探索性数据分析中特别有价值。2. AP算法核心原理解析2.1 相似度矩阵构建AP算法的起点是构建相似度矩阵S其中s(i,k)表示数据点i与点k之间的相似度。通常使用负欧氏距离% 计算相似度矩阵示例 function S calculate_similarity(X) n size(X,1); S zeros(n,n); for i 1:n for k 1:n S(i,k) -sum((X(i,:)-X(k,:)).^2); end end end注意相似度矩阵对角线元素s(k,k)称为偏好参数它决定了点k成为聚类中心的可能性。通常可以设置为所有相似度的中位数。2.2 消息传递机制AP算法通过两种消息在数据点间传递责任度r(i,k)表示点i认为点k适合作为其聚类中心的累积证据可用度a(i,k)表示点k认为自己适合作为点i的聚类中心的累积证据更新公式如下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 聚类中心确定经过多次迭代后对于每个点k当a(k,k)r(k,k)为正值时该点被选为聚类中心。其他点则归属于使其a(i,k)r(i,k)最大的聚类中心。3. MATLAB实现详解3.1 基础实现代码function [idx, centers] APCluster(X, max_iter, damp) % X: 输入数据矩阵(n×d) % max_iter: 最大迭代次数 % damp: 阻尼系数(0.5~1) n size(X,1); S calculate_similarity(X); R zeros(n,n); % 责任度矩阵 A zeros(n,n); % 可用度矩阵 % 设置偏好参数 preference median(S(:)); S(1:n1:end) preference; for iter 1:max_iter % 更新责任度 old_R R; AS A S; [Y,I] max(AS,[],2); for i 1:n AS(i,I(i)) -inf; end Y2 max(AS,[],2); R S - Y; for k 1:n R(:,k) R(:,k) - Y2; end R (1-damp)*R damp*old_R; % 更新可用度 old_A A; Rp max(R,0); Rp(1:n1:end) R(1:n1:end); A sum(Rp,1) - Rp; A min(A,0); A(1:n1:end) sum(Rp) - diag(Rp); A (1-damp)*A damp*old_A; % 检查收敛 if norm(R-old_R,fro)1e-6 norm(A-old_A,fro)1e-6 break; end end % 确定聚类中心 E A R; centers find(diag(E)0); [~,idx] max(S(:,centers),[],2); end3.2 关键参数解析偏好参数(preference)控制聚类数目值越大聚类中心越多通常设置为相似度矩阵的中位数可通过调整获得不同粒度的聚类结果阻尼系数(damp)范围0.5~1防止振荡默认0.5难收敛时可增大到0.7~0.9最大迭代次数(max_iter)通常100~500次足够可通过检查消息变化提前终止4. 实战应用与调优技巧4.1 数据预处理建议标准化处理X zscore(X); % 标准化数据相似度计算选择欧氏距离适合连续数值数据余弦相似度适合高维稀疏数据自定义相似度针对特定领域知识4.2 性能优化技巧稀疏矩阵优化 对于大规模数据可以只计算每个点的k近邻相似度function S sparse_similarity(X, k) [idx,D] knnsearch(X,X,K,k1); n size(X,1); S sparse(n,n); for i 1:n S(i,idx(i,2:end)) -D(i,2:end).^2; end end并行计算加速parfor i 1:n % 并行计算相似度 end4.3 结果评估方法轮廓系数评估silhouette(X, idx);可视化检查scatter(X(:,1),X(:,2),30,idx,filled); hold on; scatter(X(centers,1),X(centers,2),100,rx,LineWidth,2);5. 常见问题与解决方案5.1 算法不收敛现象迭代达到最大次数仍未收敛解决方案增大阻尼系数(0.7~0.9)检查相似度矩阵是否有异常值调整偏好参数可能设置过高/过低5.2 聚类数目不合理现象聚类中心过多或过少调整方法修改偏好参数preference quantile(S(:),[0.3,0.5,0.7]); % 尝试不同分位数对相似度矩阵进行缩放S S / std(S(:));5.3 内存不足现象大数据集时内存溢出优化方案使用稀疏矩阵存储采用子采样方法实现增量式AP算法6. 与其他聚类算法对比特性AP算法K-means层次聚类DBSCAN需指定聚类数否是是(切割层次)否聚类形状任意凸形任意任意噪声处理一般差一般优秀计算复杂度O(N²T)O(NKT)O(N³)O(NlogN)适合数据量中小型大型小型中型在实际项目中我通常会先用AP算法探索数据确定合理的聚类数目后再用K-means进行快速聚类。对于有噪声的数据则会考虑AP与DBSCAN的结合使用。7. 进阶应用方向7.1 半监督AP聚类利用少量标记数据引导聚类过程% 设置部分must-link约束 S(must_link_pairs) max(S(:));7.2 时序数据AP聚类考虑时间相邻点的相似度增强S(i,i1) S(i,i1) * 1.5; % 增强时序相邻点相似度7.3 多视图AP聚类融合多个特征视图的相似度S_combined α*S1 (1-α)*S2; % 线性组合多视图相似度经过多个项目的实践验证AP算法在客户分群、图像分割、文本主题发现等领域都有出色表现。特别是在数据特性不明确时AP算法能提供有价值的初始洞察。不过要注意对于超过1万样本的数据集需要考虑算法优化或采样策略。

相关新闻

LeetCode 395题解析:分治法求解最长K重复字符子串

LeetCode 395题解析:分治法求解最长K重复字符子串

1. 问题背景与理解LeetCode 395题"至少有 K 个重复字符的最长子串"是一个经典的字符串处理问题,考察我们对分治算法和递归思想的理解。题目要求我们找到给定字符串中最长的子串,其中每个字符的出现次数都不少于k次。我第一次遇到这个问题时&am…

2026/10/14 14:18:29 阅读更多 →
K次重复字符最长子串:分治与滑动窗口解法详解

K次重复字符最长子串:分治与滑动窗口解法详解

1. 问题理解与初步分析遇到"至少有 K 个重复字符的最长子串"这个问题时,我第一反应是这属于字符串处理中的滑动窗口类问题。但仔细分析后发现问题比常规滑动窗口更复杂,因为除了窗口边界移动外,还需要考虑字符出现频率的统计。题目…

2026/10/14 14:18:29 阅读更多 →
Linux磁盘清理与分区调整:从排查到自动化实践全指南

Linux磁盘清理与分区调整:从排查到自动化实践全指南

磁盘满了,这四个字大概是Linux运维生涯里出现频率最高的告警,没有之一。不管你是个人桌面用户、自建NAS的爱好者,还是正经管几台服务器的运维,几乎都经历过那种“明明没装几个东西,df -h一看某个分区已经100%”的窒息时…

2026/10/14 14:18:29 阅读更多 →

最新新闻

手写负载均衡:从轮询到一致性哈希的算法与工程实践

手写负载均衡:从轮询到一致性哈希的算法与工程实践

手写负载均衡这件事,听起来像是业务代码写多了自娱自乐,但真把它当回事做一遍的人,对分布式流量的理解完全不一样。很多时候我们一直在用现成组件——Nginx、LVS、各种注册中心自带的负载策略——出了问题只能对着文档调参数,根本…

2026/10/14 19:56:03 阅读更多 →
GitLab初次安装避坑指南:Omnibus部署全流程与7类高频故障排查

GitLab初次安装避坑指南:Omnibus部署全流程与7类高频故障排查

1. 项目概述:为什么“初次安装”这件事值得单独写一篇长文?GitLab 不是点开浏览器输个网址就能用的 SaaS 服务——它是个需要你亲手部署、配置、调优的完整软件栈。我见过太多人卡在“初次安装”这一步:有人在 Ubuntu 上跑通了却在 CentOS 里…

2026/10/14 19:56:03 阅读更多 →
Python分支结构深度梳理:从if语法到match-case实践

Python分支结构深度梳理:从if语法到match-case实践

分支结构这件事,看起来很简单,不就是个 if 吗?但我在带新手和看项目代码时发现,很多人写了两三年 Python,对分支的理解还停留在"会用 if-else",一旦遇到复杂的判断逻辑就写得又臭又长&#xff0c…

2026/10/14 19:56:03 阅读更多 →
厂商内核与驱动定制全流程:从源码获取到调试避坑实战指南

厂商内核与驱动定制全流程:从源码获取到调试避坑实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 19:56:03 阅读更多 →
Java桌面宠物实现:透明窗口与Swing动画机制详解

Java桌面宠物实现:透明窗口与Swing动画机制详解

简介:一份使用Java语言编写的桌面宠物小例子,面向初学图形界面编程的开发者,用于掌握窗口构建、事件监听、动画刷新与多线程协作等核心技能。资源包共80个文件,包含Java源码、编译后的class文件、宠物图片素材以及Eclipse工程配置…

2026/10/14 19:56:03 阅读更多 →
FPGA交通灯实战:EP2C35F672C6引脚约束与Quartus II 9.1工程落地

FPGA交通灯实战:EP2C35F672C6引脚约束与Quartus II 9.1工程落地

简介:本资源是一份基于Altera Cyclone II EP2C35F672C6 FPGA芯片实现的十字路口交通灯控制系统完整工程包,面向数字电路、EDA与FPGA初学者及课程设计学生,解决状态机建模、数码管动态扫描、多模块时序协同等典型实践难点。压缩包共120个文件&…

2026/10/14 19:55:02 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →