首页 > 编程语言 >【大数据分析与挖掘算法】matlab实现——DBSCAN聚类方法

【大数据分析与挖掘算法】matlab实现——DBSCAN聚类方法

时间:2024-10-20 12:51:36浏览次数:11  
标签:neighbors DBSCAN end Means matlab 聚类 data

实验六 :DBSCAN聚类方法

一、实验目的

掌握DBSCAN聚类方法的基本理论,通过编程对实例进行聚类。

二、实验任务

对DBSCAN聚类方法进行编码计算,实例如下:

三、实验过程

1.DBSCAN聚类模型介绍:

2.具体步骤介绍:

四、实验结果

实现平台:Matlab 2022A

实验代码:

% 示例数据
data = [
    1, 0;
    4, 0;
    0, 1;
    1, 1;
    2, 1;
    3, 1;
    4, 1;
    5, 1;
    0, 2;
    1, 2;
    4, 2;
    1, 3;
];

% 设置参数
epsilon = 1;
minPts = 4;

% 调用DBSCAN算法
result_clusters = dbscan(data, epsilon, minPts);

% 显示结果
fprintf('DBSCAN聚类结果:\n');
for i = 1:length(result_clusters)
    fprintf('簇 %d:\n', i);
    disp(result_clusters{i});
end

% 定义DBSCAN算法函数
function clusters = dbscan(data, epsilon, minPts)
    n = size(data, 1); % 数据库中数据对象的数量
    labels = zeros(n, 1); % 初始化标签为0,表示未分类
    cluster_id = 0; % 初始化簇ID
    
    % 计算距离矩阵
    D = pdist2(data, data);
    
    % 遍历每个点
    for i = 1:n
        if labels(i) ~= 0 % 如果该点已经分类,跳过
            continue;
        end
        
        % 找到epsilon范围内的所有点
        neighbors = find(D(i, :) <= epsilon);
        
        if numel(neighbors) < minPts % 如果邻居数量少于minPts,将其标记为噪声
            labels(i) = -1;
            continue;
        end
        
        % 形成一个新簇
        cluster_id = cluster_id + 1;
        labels(i) = cluster_id;
        
        % 处理该簇的所有邻居点
        j = 1;
        while j <= numel(neighbors)
            neighbor_idx = neighbors(j);
            
            if labels(neighbor_idx) == -1 % 如果邻居点是噪声点,将其归为当前簇
                labels(neighbor_idx) = cluster_id;
            end
            
            if labels(neighbor_idx) == 0 % 如果邻居点未分类
                labels(neighbor_idx) = cluster_id;
                
                % 找到邻居点的新邻居
                new_neighbors = find(D(neighbor_idx, :) <= epsilon);
                if numel(new_neighbors) >= minPts
                    neighbors = [neighbors, new_neighbors]; % 将新的邻居加入到邻居列表中
                    neighbors = unique(neighbors, 'stable'); % 去重并保持顺序
                end
            end
            
            j = j + 1;
        end
    end
    
    % 将结果转换为簇的格式
    clusters = arrayfun(@(c) data(labels == c, :), unique(labels(labels > 0)), 'UniformOutput', false);
end

实验结果:

五、个人总结

1.对DBSCAN聚类方法的理解

和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数k,最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,这点和BIRCH算法类似。一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。

(1)DBSCAN的优点:

1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。

2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。

3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

(2)DBSCAN的缺点:

1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。

2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。

3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响

2.对编码实现过程的回顾

一开始编写这个代码的时候,完全按着书上的逻辑走,我写了很多循环,重复计算了很多次欧氏距离等,导致整个代码的效率很低下,十几分钟也没能跑出来。后来对代码进行了优化,采用矩阵运算来替换循环,也简化了聚类的生成过程,避免一些不必要的循环操作。同时采用标签数组进行簇的标记,更清晰和高效。neighbors和new_neighbors要做水平拼接避免矩阵维度不一致。可以使用 unique 函数的 stable选项确保删除重复值的同时保持原有顺序。

标签:neighbors,DBSCAN,end,Means,matlab,聚类,data
From: https://blog.csdn.net/qq_37293468/article/details/143091168

相关文章

  • EKF、UKF、CKF的对比(MATLAB代码)
      扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)和容积卡尔曼滤波(CKF)。通过对比这三种算法在相同动态系统下的表现,用户能够深入理解每种滤波器的优缺点,为自己的项目选择最合适的技术方案。主要特点三种滤波算法对比:同时实现EKF、UKF和CKF,便于用户直观比较不同算法在相同条件下......
  • Matlab使用LSTM或BiLSTM对一维信号(语音信号、心电信号等)进行二分类源程序。也可以改
     Matlab使用LSTM或BiLSTM对一维信号(语音信号、心电信号等)进行二分类源程序。也可以改成多分类。包含数据和代码,数据可以直接替换为自己的数据。如果用BiLSTM,程序中只需要把lstmlayer改为bilstmlayer即为BiLSTM网络,其他地方不需要任何改动。工作如下:1、加载数据集,一共为......
  • 乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 开源数学库Math.NET,替代Matla
    Math.NEThttps://www.mathdotnet.comMath.NET是一个广泛使用的开源数学库,专为.NET语言(如C#和F#)设计,提供了各种高性能的数学和统计计算功能。它帮助开发者进行线性代数、统计分析、随机数生成、微积分、优化和信号处理等计算,尤其在科学计算、工程应用以及数据分析中被广泛使......
  • 层次聚类法(matlab实现)
    层次聚类法的优点包括能够揭示数据集的层次结构,有助于理解数据内在关系,无需预先设定聚类数目,并且可以通过树状图直观地裁剪得到不同粒度的聚类结果。然而,层次聚类的不足之处在于算法的时间复杂度大,结果依赖聚类的合并点和分裂点的选择,且层次聚类过程是不可逆的,一旦聚类结果形成......
  • matlab点击实时绘制bezier曲线
    贝塞尔曲线的原理贝塞尔曲线是通过一组控制点定义的参数曲线。曲线不会直接穿过这些点,但这些点会影响曲线的形状。控制点确定了曲线的弯曲程度和方向。贝塞尔曲线的数学公式基于伯恩斯坦多项式(BernsteinPolynomials)。对于一个n次的贝塞尔曲线,它由n+1个控制点​定义。曲线......
  • MATLAB 工具箱详细重点知识点概述 MATLAB 工具箱使用案例
    一、章节目录MATLAB工具箱概述常见MATLAB工具箱介绍MATLAB工具箱使用案例展示学习MATLAB工具箱的方法MATLAB工具箱的发展趋势二、各章节知识点总结MATLAB工具箱概述MATLAB是一种广泛应用于科学计算、数据分析、算法开发等领域的高级编程语言和交互式环境。MA......
  • 数学建模与数学实验习题4.4.2答案matlab
    炼油厂将ABC三种原油加工成甲乙丙三种汽油,一桶原油加工成一桶汽油的费用为4元,每天至多能加工汽油14000桶,原油的买入价,买入量,辛烷值,硫的含量以及汽油的卖出价,需求量辛烷值和硫含量由下表给出,如何安排生产计划使利润最大一般来说,做广告可以增加销售,估计一天向一种汽油投......
  • Matlab 生成“少帅下飞机”粒子边缘特效(附源代码)
    这里是使用Matlab生成的“少帅下飞机”粒子边缘特效,大家也可以去尝试一下,文末附视频素材和源码,需要Matlab下载教程的可以私信后台哦!本期视频素材及matlab源码下载链接:https://pan.quark.cn/s/37f034f9a180此处改为自己的文件路径即可%读取视频videoFile="D:\少帅下飞......
  • RRT*路径搜索算法matlab代码
    一、算法简介      RRT*路径搜索算法相比于RRT路径搜索算法多了重选父节点和重布线的过程:二、实现效果对比(比RRT算法更光滑) RRT路径搜索算法实现效果RRT*路径搜索算法实现效果三、代码完整代码私聊!......
  • 粒子群算法应用——聚类优化
    粒子群算法详见:https://blog.csdn.net/liutianbao2018/article/details/142743205目录1K均值聚类原理1.1什么是聚类1.2K均值聚类原理2PSO改进K均值聚类3结果对比1K均值聚类原理1.1什么是聚类聚类是一种无监督学习方法,通过相似性度量将数据点划分为多个簇,使得同......