当前位置:首页 > 技术 > 正文内容

基于双阈值预处理的Canopy聚类算法及MATLAB实现

访客 技术 2026年8月28日 2

算法核心机制

Canopy聚类是一种轻量级的粗粒度划分策略,主要用于高维数据的快速预处理。该算法不依赖复杂的迭代优化,而是通过设定两个距离阈值($T_1$ 与 $T_2$,且 $T_1 > T_2$)对特征空间中的样本进行分层过滤。其核心流程如下:

  1. 初始化包含所有样本的候选集合,并设定宽松阈值 $T_1$ 与严格阈值 $T_2$。
  2. 从候选集中随机抽取一个数据点作为新Canopy的初始中心,并将其移出集合。
  3. 遍历剩余样本,计算各点与当前中心的距离。若距离小于 $T_2$,则判定为强归属,直接将该点从候选集中剔除(避免其成为其他Canopy的中心);若距离介于 $T_2$ 与 $T_1$ 之间,则标记为弱归属(该点保留在候选集中,允许重叠划分);若距离大于 $T_1$,则不作处理。
  4. 重复上述步骤,直至候选集为空。最终生成一组可能存在交集的Canopy子集。

Canopy双阈值划分示意图

该算法通常不作为独立的聚类方案,而是作为K-Means等精确聚类算法的前置步骤。通过快速剔除噪声点与孤立点,并预估初始簇中心数量,可显著降低后续精细聚类的计算复杂度。

阈值配置策略

算法的划分质量高度依赖于 $T_1$ 和 $T_2$ 的设定:

  • $T_1$ 过大:导致Canopy覆盖范围过广,簇间重叠率升高,中心点分布密集,削弱预聚类效果。
  • $T_2$ 过大:强归属区域扩张,大量样本被提前剔除,最终生成的簇数量偏少,可能掩盖真实数据结构。
  • $T_2$ 过小:核心区域收缩,候选集剔除效率降低,生成的簇数量激增,同时增加距离计算开销。

工程实践中,常通过对数据子集进行抽样,计算样本间距离的均值与标准差,动态推导合理的阈值区间。

MATLAB实现代码

以下实现基于Iris数据集,采用动态阈值估算与向量化距离计算,通过多次蒙特卡洛实验统计稳定的簇数量分布。

clear; clc;
% 载入特征矩阵(剔除末尾类别标签)
dataset = dlmread('iris.data');
X = dataset(:, 1:end-1);
[N, D] = size(X);

runs = 100;
K_history = zeros(runs, 1);
MAX_K = 20;

for r = 1:runs
    % 抽取10%子集估算距离分布特征
    idx = randperm(N, ceil(N*0.1));
    subset = X(idx, :);
    pairDist = pdist(subset);

    % 动态生成双阈值
    T_weak = mean(pairDist) + 4 * std(pairDist);  % 宽松边界 T1
    T_strong = T_weak * 0.5;                      % 严格边界 T2

    pool = X;
    canopies = [];
    k = 0;

    while ~isempty(pool) && k < MAX_K
        k = k + 1;
        centroid = pool(1, :);
        canopies = [canopies; centroid];
        pool(1, :) = [];  % 移除已选中心

        if isempty(pool), break; end

        % 批量计算欧氏距离平方
        delta = pool - centroid;
        d2 = sum(delta.^2, 2);

        % 强阈值内的点直接移出候选池,不参与后续中心竞争
        removeIdx = d2 < T_strong^2;
        pool(removeIdx, :) = [];
    end
    K_history(r) = k;
end

% 统计多次实验的聚类数目分布
tabulate(K_history)

运行结果与分析

  Value    Count   Percent
      1        0      0.00%
      2        0      0.00%
      3       98     98.00%
      4        2      2.00%
      5        0      0.00%

实验输出表明,在设定的阈值策略下,算法在绝大多数迭代中稳定输出 $K=3$ 的划分结果,与Iris数据集的真实类别数高度吻合。由于Canopy的生成过程依赖随机抽样与阈值截断,最终簇数量会随 $T_2$ 的缩放产生波动。在实际应用中,可将此结果直接作为K-Means的初始 $K$ 值与中心点先验,从而规避传统聚类算法对初始参数敏感的问题。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。