当前位置: 首页 > article >正文

告别K-Means!用Python手撸Science上的DPC算法,搞定任意形状数据聚类

密度峰值聚类DPC用Python突破传统K-Means的局限当面对螺旋形、环形或交叉分布的数据集时许多数据科学从业者都有过这样的经历反复调整K-Means参数却始终无法获得理想的聚类效果。这正是2014年发表在《Science》上的密度峰值聚类算法(DPC)要解决的核心问题。与传统方法不同DPC通过创新的密度峰值概念能够自动识别任意形状数据中的自然聚类中心无需预先指定簇数量。1. 为什么需要超越K-MeansK-Means算法自1967年提出以来因其简单高效成为最广泛使用的聚类工具。但它存在两个根本性局限球形分布假设K-Means基于样本与簇中心的欧式距离进行划分隐含假设数据呈球形分布。这在处理螺旋形、月牙形等复杂结构时效果显著下降。K值依赖需要人工指定聚类数量K而实际应用中K往往未知。错误的K值会导致完全偏离真实结构的聚类结果。# 典型K-Means在复杂数据上的失败案例 from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 生成螺旋数据集 theta np.linspace(0, 4*np.pi, 200) r np.linspace(0.5, 1, 200) x r * np.cos(theta) y r * np.sin(theta) spiral np.column_stack([x, y]) # K-Means聚类 kmeans KMeans(n_clusters3).fit(spiral) plt.scatter(spiral[:,0], spiral[:,1], ckmeans.labels_) plt.title(K-Means在螺旋数据上的表现) plt.show()相比之下DPC算法具有三大突破性优势形状无关性基于局部密度而非距离可识别任意形状的簇自动中心发现通过密度峰值自动确定聚类中心无需预设K值离群点鲁棒性对噪声数据不敏感能自然区分核心点与边缘点2. DPC算法核心原理拆解DPC建立在两个直观而强大的假设基础上假设一聚类中心点的局部密度应显著高于周围邻居假设二聚类中心应与更高密度的点保持较远距离这两个假设转化为两个核心计算指标2.1 局部密度(ρ)计算局部密度衡量数据点周围的样本密集程度DPC提供两种计算方式计算方式公式适用场景截断核ρᵢ ∑ⱼχ(dᵢⱼ - d_c)离散型数据高斯核ρᵢ ∑ⱼexp(-(dᵢⱼ/d_c)²)连续型数据其中d_c是关键参数——截断距离通常选择使每个点平均有1%-2%的邻居落在d_c范围内。def compute_density(dists, dc, methodgaussian): 计算局部密度 if method cutoff: rho np.sum(dists dc, axis1) - 1 # 排除自身 else: # gaussian rho np.sum(np.exp(-(dists/dc)**2), axis1) - 1 return rho2.2 相对距离(δ)计算对于每个点iδᵢ定义为若是最高密度点δᵢ max(dᵢⱼ)其他点δᵢ min(dᵢⱼ) where ρⱼ ρᵢdef compute_delta(dists, rho): 计算相对距离 N len(rho) delta np.zeros(N) nearest_higher np.zeros(N, dtypeint) # 按密度降序排序索引 rho_order np.argsort(-rho) for i, idx in enumerate(rho_order): if i 0: # 最高密度点 delta[idx] np.max(dists[idx]) nearest_higher[idx] -1 else: # 找出密度更高的点 higher_mask rho rho[idx] if np.any(higher_mask): delta[idx] np.min(dists[idx, higher_mask]) nearest_higher[idx] np.argmin(dists[idx, higher_mask]) else: delta[idx] np.max(dists[idx]) nearest_higher[idx] -1 return delta, nearest_higher2.3 决策图与中心选择将ρ和δ绘制为决策图(Decision Graph)聚类中心表现为右上角的离群点——同时具有高ρ和高δ。实际应用中可以设定ρ和δ的双阈值或选择ρ×δ乘积最大的前K个点作为中心。3. 完整DPC实现与可视化下面我们实现完整的DPC流程并在螺旋数据集上进行测试class DensityPeakClustering: def __init__(self, dc_percent2.0): self.dc_percent dc_percent def fit(self, X): # 计算距离矩阵 self.dists np.sqrt(((X[:, None] - X) ** 2).sum(axis2)) # 确定截断距离dc N X.shape[0] position int(N * (N - 1) * self.dc_percent / 100) self.dc np.sort(self.dists.ravel())[position N] # 计算局部密度 self.rho compute_density(self.dists, self.dc) # 计算相对距离 self.delta, self.nearest_higher compute_delta(self.dists, self.rho) return self def find_centers(self, autoTrue, KNone): if auto: # 自动阈值法 rho_thresh (np.min(self.rho) np.max(self.rho)) / 2 delta_thresh (np.min(self.delta) np.max(self.delta)) / 2 self.centers np.where((self.rho rho_thresh) (self.delta delta_thresh))[0] else: # 指定K值法 product self.rho * self.delta self.centers np.argsort(-product)[:K] return self.centers def assign_clusters(self): K len(self.centers) self.labels -np.ones(len(self.rho), dtypeint) # 标记中心点 for i, center in enumerate(self.centers): self.labels[center] i # 按密度降序分配标签 for idx in np.argsort(-self.rho): if self.labels[idx] -1: self.labels[idx] self.labels[self.nearest_higher[idx]] return self.labels可视化展示# 生成测试数据 from sklearn.datasets import make_moons X, _ make_moons(n_samples300, noise0.05) # DPC聚类 dpc DensityPeakClustering(dc_percent2).fit(X) centers dpc.find_centers(autoTrue) labels dpc.assign_clusters() # 绘制结果 plt.figure(figsize(12,5)) plt.subplot(121) plt.scatter(dpc.rho, dpc.delta, ck, s10) plt.scatter(dpc.rho[centers], dpc.delta[centers], cr, s50) plt.xlabel(Density (ρ)) plt.ylabel(Delta (δ)) plt.title(Decision Graph) plt.subplot(122) plt.scatter(X[:,0], X[:,1], clabels, cmapviridis, s20) plt.scatter(X[centers,0], X[centers,1], cred, markerx, s100) plt.title(Clustering Result) plt.show()4. 实战优化与参数调优虽然DPC理论优雅但实际应用中需要注意几个关键点4.1 截断距离dc的选择dc直接影响密度计算结果建议采用以下策略百分比法保持1%-2%的邻居比例默认方法k近邻法取每个点到第k近邻的距离中位数网格搜索在候选dc值中选择使聚类结果最稳定的值def find_optimal_dc(dists, percent_range(1,3)): 寻找最佳dc值 N dists.shape[0] results [] for percent in np.linspace(*percent_range, 10): position int(N * (N - 1) * percent / 100) dc np.sort(dists.ravel())[position N] rho compute_density(dists, dc) delta, _ compute_delta(dists, rho) product rho * delta # 使用轮廓系数评估稳定性 centers np.argsort(-product)[:3] labels assign_clusters(rho, centers, nearest_higher) if len(np.unique(labels)) 1: score silhouette_score(dists, labels, metricprecomputed) results.append((percent, dc, score)) return max(results, keylambda x: x[2])4.2 处理大规模数据原始DPC的O(N²)复杂度限制了其在大型数据集的应用可通过以下方法优化子采样先在小样本上确定dc和中心再扩展到全数据集KD树/球树加速最近邻搜索分布式计算将距离矩阵计算分布到多台机器from sklearn.neighbors import KDTree def fast_compute_density(X, dc, k30): 使用KDTree加速密度计算 tree KDTree(X) counts tree.query_radius(X, rdc, count_onlyTrue) return counts - 1 # 排除自身4.3 多维度数据预处理高维数据中距离度量可能失效建议使用PCA等降维技术保留主要特征采用马氏距离考虑特征相关性对连续和离散特征分别处理from sklearn.decomposition import PCA # 高维数据预处理 pca PCA(n_components0.95) X_reduced pca.fit_transform(X_highdim) dpc DensityPeakClustering().fit(X_reduced)5. DPC进阶应用场景DPC的特殊优势使其在多个领域大放异彩5.1 异常检测高δ低ρ的点往往是异常值这种方法比传统阈值法更可靠def find_anomalies(rho, delta, alpha0.1): 基于DPC的异常检测 rho_norm (rho - np.min(rho)) / (np.max(rho) - np.min(rho)) delta_norm (delta - np.min(delta)) / (np.max(delta) - np.min(delta)) anomaly_scores delta_norm - rho_norm threshold np.percentile(anomaly_scores, 100*(1-alpha)) return anomaly_scores threshold5.2 层次聚类扩展通过调整dc值可以自然获得层次聚类结构从小dc开始识别细粒度簇逐渐增大dc观察簇的合并过程构建聚类树状图5.3 图像分割应用将像素的坐标和颜色作为特征DPC可实现自动图像分割def image_segmentation(image, dc_percent0.5): 基于DPC的图像分割 h, w image.shape[:2] coords np.indices((h, w)).transpose(1,2,0).reshape(-1,2) colors image.reshape(-1, 3) features np.hstack([coords/10, colors]) # 坐标权重降低 dpc DensityPeakClustering(dc_percent).fit(features) centers dpc.find_centers(autoTrue) labels dpc.assign_clusters() return labels.reshape(h, w)在实际项目中DPC算法特别适合处理那些传统方法难以应对的复杂结构数据。我曾在一个客户行为分析项目中使用DPC成功识别出5种独特的用户群体这些群体在传统的RFM模型中被混为一谈。算法的自动中心发现功能帮助我们发现了两个从未考虑过的重要客户细分。

相关文章:

告别K-Means!用Python手撸Science上的DPC算法,搞定任意形状数据聚类

密度峰值聚类DPC:用Python突破传统K-Means的局限当面对螺旋形、环形或交叉分布的数据集时,许多数据科学从业者都有过这样的经历:反复调整K-Means参数却始终无法获得理想的聚类效果。这正是2014年发表在《Science》上的密度峰值聚类算法(DPC)要…...

医疗AI公平性评估:从数据复杂性到系统任意性的三支柱分析框架

1. 项目概述:当医疗AI遇上公平性拷问在医疗健康领域,机器学习模型正从实验室的“概念验证”阶段,大步迈向临床决策支持的“实战”前线。无论是预测糖尿病风险,还是辅助诊断心脏病,这些算法模型的核心承诺是&#xff1a…...

量子机器学习可解释性:从黑箱到透明决策的LRP与数字孪生方法

1. 量子机器学习可解释性:从黑箱到透明决策量子机器学习(QML)这几年火得不行,但说实话,很多从业者,包括我自己在内,最初接触时都有点“懵”。模型性能上去了,可它到底是怎么做决策的…...

Keil µVision项目复制后构建失败的诊断与解决

1. 问题现象与背景解析最近在Keil Vision开发环境中遇到一个典型的"项目复制后构建失败"问题:将一个原本正常编译的C语言项目复制到新目录后,仅做了少量修改,却突然出现error (40): expected an identifier or (的语法错误。这种情…...

【AI Agent游戏行业应用实战指南】:20年资深架构师亲授7大落地场景与避坑清单

更多请点击: https://intelliparadigm.com 第一章:AI Agent游戏行业应用全景图谱 AI Agent 正在重塑游戏开发、运营与玩家体验的全生命周期。从智能NPC的行为建模,到自动化测试与关卡生成,再到实时个性化内容推荐与跨平台玩家陪伴…...

【AI Agent旅游行业落地实战指南】:2024年已验证的7大高ROI应用场景与避坑清单

更多请点击: https://kaifayun.com 第一章:AI Agent旅游行业应用全景图 AI Agent正以前所未有的深度与广度重塑旅游产业的服务范式。它不再局限于单点智能响应,而是以目标驱动、多工具协同、自主规划与持续反思为特征,构建起覆盖…...

别再手动写日报了!Claude项目中枢搭建全教程(含API对接、敏感信息脱敏、审计留痕三重安全机制)

更多请点击: https://kaifayun.com 第一章:Claude项目中枢的定位与核心价值 Claude项目中枢是整个AI协作体系的调度核心与语义枢纽,它不直接执行模型推理,而是承担上下文治理、权限编排、多模态协议适配与可信链路审计等关键职能…...

昇腾CANN opbase 算子注册与分发调度:从 API 到 AI Core 的路径追踪

所有 CANN 算子都依赖 opbase——它不是写具体算子的地方,而是算子的"注册中心 调度器"。用户调用 torch.nn.functional.softmax(x) → PyTorch 转发到 CANN → CANN 查 opbase 的算子注册表 → 找到对应的 Ascend C kernel → 加载到 AI Core → 执行。…...

在CentOS 7上搞定Cadence IC618、XCELIUM和SPECTRE全家桶:一个Modulefile环境变量配置全攻略

在CentOS 7上搞定Cadence IC618、XCELIUM和SPECTRE全家桶:一个Modulefile环境变量配置全攻略对于芯片设计工程师而言,Cadence工具链的部署往往意味着数天的系统调优和环境调试。当IC设计、数字仿真和电路模拟三大核心工具需要协同工作时,环境…...

SuperCam:从源头减量的超像素传感器,重塑边缘视觉感知范式

1. 项目概述:为什么我们需要一种直接输出超像素的传感器?在计算机视觉领域,我们早已习惯了与像素打交道。无论是手机拍照、视频监控,还是自动驾驶的感知模块,其底层数据都源于一个由数百万乃至上亿个正方形像素点构成的…...

Linux服务器基线检查实战:从合规到安全能力的跃迁

1. 为什么基线检查不是“走个过场”,而是服务器生死线上的第一道闸门很多人第一次接触“Linux服务器基线检查”,是在安全团队发来的一份《等保2.0整改清单》里,或是运维晨会时被点名:“XX系统基线不合规,限期3天修复”…...

基于KDTree的机器学习壁面函数:提升CFD湍流模拟精度与效率

1. 项目概述在计算流体力学(CFD)的湍流模拟领域,尤其是处理高雷诺数工程流动时,近壁面区域的精确建模一直是个核心挑战。直接对粘性底层进行网格解析(Wall-Resolved LES/DES)虽然精度高,但计算成…...

Unity编辑器AI增强:本地化轻量模型驱动的开发效率升级

1. 不是“接管”,而是编辑器能力的自然延伸:从Unity传统工作流说起你有没有过这样的时刻:在Unity里改完一段C#脚本,保存,切回编辑器,等几秒——然后发现Scene视图没刷新;再点一下Play&#xff0…...

Android系统级证书注入:突破HTTPS抓包限制的完整方案

1. 这不是“换个证书”那么简单:为什么系统级证书安装成了Android抓包真正的分水岭你肯定试过在Android手机上用Charles抓包——App打开,Charles配好代理,手机Wi-Fi设好代理地址,点开浏览器,流量哗哗进来了。但一打开微…...

C# AR应用性能优化三大硬核策略

1. 这不是“加个特效”就能解决的问题:AR应用卡顿背后的真实战场C# AR应用优化实战——这七个字,我盯着看了三分钟。不是因为难懂,而是因为太熟悉了。过去三年,我带过7个AR项目,从工业设备远程巡检到博物馆文物交互导览…...

面向非计算机背景研究者的NLP实战教程:从零到一掌握文本分析

1. 项目概述:一场为跨学科研究者量身定制的机器学习“实战营”如果你是一位社会学、政治学或公共卫生领域的研究者,面对海量的访谈记录、社交媒体文本或历史档案,是否曾感到传统分析方法力不从心?又或者,你早已听闻机器…...

Julia语言在科学机器学习领域的优势、挑战与实践指南

1. 科学机器学习:当物理定律遇见数据驱动如果你和我一样,长期在科学计算和机器学习的交叉领域“搬砖”,那你一定对“两难困境”深有体会。我们既需要Python那样灵活、易上手的语法来快速验证物理模型和算法原型,又渴望C级别的极致…...

多智能体系统内存架构:共享与分布式内存的挑战与混合实践

1. 项目概述:当多智能体系统遇上计算机内存模型最近在折腾一个多智能体协作的项目,遇到了一个挺有意思的瓶颈:当几十个甚至上百个智能体(Agent)同时在一个环境里跑起来,试图共享信息、协同决策时&#xff0…...

Redis分布式锁进阶第五十六篇

Redis分布式锁进阶第二十五篇:联锁深度拆解 多资源交叉死锁根治 复杂业务多级加锁绝对有序方案一、本篇前置衔接 第二十四篇我们完成了全系列终局复盘,整理了故障排查SOP与企业级落地铁律。常规单资源锁、热点分片锁、隔离锁全部讲透,但真实…...

小电视空降助手:终极B站广告跳过插件完整指南

小电视空降助手:终极B站广告跳过插件完整指南 【免费下载链接】BilibiliSponsorBlock 一款跳过小电视视频中恰饭片段的浏览器插件,移植自 SponsorBlock。A browser extension to skip sponsored segments in videos, ported from the SponsorBlock 项目…...

别再报错‘不在sudoers文件中’了!手把手教你用visudo安全配置CentOS/RHEL用户sudo权限

安全配置Linux系统sudo权限的终极指南当你第一次在终端输入sudo命令时,看到"用户不在sudoers文件中"的提示,那种挫败感每个Linux用户都深有体会。但别急着用chmod修改文件权限——这种"野路子"虽然能快速解决问题,却可能…...

STIML框架:融合标度理论与机器学习的企业增长预测新范式

1. 项目概述:当标度律遇见机器学习在金融分析和企业研究领域,预测一家公司的未来增长,就像试图预测一艘巨轮在复杂洋流中的航迹。传统上,我们有两类“航海图”:一类是基于物理定律的“机制模型”,它告诉你船…...

ALPEC框架:革新睡眠觉醒事件检测的评估范式

1. 项目概述:从“数点”到“看事件”的评估范式革新在睡眠医学的日常工作中,分析一整夜的多导睡眠图(PSG)数据,手动标记出每一次短暂的睡眠觉醒事件,是一项极其耗时且对专家经验依赖度极高的工作。一个典型…...

量子机器学习泛化边界:噪声环境下的理论与工程挑战

1. 量子机器学习泛化边界:理论与噪声的博弈场 量子机器学习(QML)正站在一个激动人心又充满挑战的十字路口。作为一名长期关注量子算法落地的从业者,我目睹了无数论文在理想化的模拟环境中宣称“量子优势”,却在真实的含…...

广义可加模型(GAMs)性能实测:可解释机器学习如何兼顾精度与透明度

1. 项目概述:当可解释性成为硬通货,GAMs如何破局? 在医疗诊断、信贷审批、司法风险评估这些“高风险”领域,一个预测模型如果只告诉你“结果是A”,却无法解释“为什么是A”,那它几乎毫无价值。决策者需要的…...

基于IoT与MPC的老旧建筑HVAC智能节能系统实践

1. 项目概述:当老建筑遇上新智慧在建筑能耗这个老生常谈的话题里,既有建筑,尤其是那些上了年纪、缺乏智能系统的老楼,往往是被遗忘的角落。大家的目光总聚焦在那些配备了先进楼宇自控系统的新建“智能建筑”上,但现实是…...

CON-FOLD算法:为可解释规则注入置信度与剪枝优化

1. 项目概述:为规则赋予“可信度”的CON-FOLD算法在可解释机器学习(XAI)领域,我们常常面临一个核心矛盾:模型的可解释性与预测的可靠性如何兼得?像决策树、规则列表这类模型,其决策路径清晰可见…...

机器学习势函数结合热力学积分:高效精准预测材料高温热力学性质

1. 项目概述与核心价值在材料科学和凝聚态物理领域,准确预测材料的热力学性质——如热容、热膨胀系数和体模量——是理解其相稳定性、设计新型合金和优化材料性能的基石。这些性质直接关联到材料的自由能面,而自由能面的精确计算,尤其是在高温…...

从λκ观测量到喷注鉴别:探索夸克与胶子分类的最优尺度

1. 项目概述与核心问题在大型强子对撞机(LHC)上,我们每秒要处理数以亿计的质子-质子对撞事件。这些对撞产生的绝大多数产物,是量子色动力学(QCD)主导的强子化过程所形成的“喷注”——即高度准直的强子流。…...

我的crontab脚本总是不执行?一份超全的Linux定时任务排错自查清单

我的crontab脚本总是不执行?一份超全的Linux定时任务排错自查清单 当你深夜收到服务器告警,发现关键备份任务没有按时执行时,那种头皮发麻的感觉每个运维人员都懂。crontab作为Linux系统最常用的定时任务工具,看似简单的配置背后…...