聚类算法4——DBSCAN密度聚类(算法步骤及matlab代码)

2023-11-10

看了西关书的聚类算法,算法原理很容易明白,接下来就是整理成自己的理解思路,然后一步一步来实现算法,那么就来做吧。

DensityClustering算法

  • 概念

从样本密度的角度考察样本之间的可连接性,样本分布的紧密程度刻画聚类结构

  • 术语

核心对象:样本x_j的Δd邻域内至少包含MinPts个样本,称x_j为核心对象

密度直达:x_j邻域内的样本x_i,称x_j由x_i密度直达

密度可达:对于x_j和x_i,存在样本序列p1,p2,…pn,若p1=x_j,pn=x_i,p_i+1由p_i密度直达,x_j和x_i密度可达

密度相连:对于x_j和x_i,若存在x_k,使得x_i与x_j均由x_k密度可达,则x_j和x_i密度相连。

DBSCAN将簇定义为:由密度可达关系导出最大密度相连样本集合。

三、算法步骤

输入:样本集,邻域参数(邻域距离Δd,最小包含邻域样本个数MinPst)

输出:聚类簇划分

Step1、搜索核心对象集 search_objects()

输入:样本集D,邻域参数;输出:核心对象集

Step1.1载入数据集,初始化核心对象集、邻域参数

Step1.2 遍历样本,根据邻域参数,搜索核心对象,并添加到核心对象集合中

Setp2、密度聚类 density_clustering()

输入:核心对象集O,样本集T = D,邻域参数

输出:聚类簇个数k,聚类簇划分集C

Step2.1初始化聚类样本簇k=0;初始化未访问样本集合T =D;

Step2.2 repeat_Objects_clustering();源源不断的对核心对象集中的元素抽取以聚类原则工作

K=0;T=D;

While O != NULL

记录当前未访问的样本集合T_old = T

随机选取一个核心对象o∈O, 初始化队列Q = < o>

T=T\{o};

While Q!=NULL

取出队列Q中的首个样本q

If q的邻域样本个数>= MinPst

Δ = q的邻域样本

Q= {Q;Δ}

T = T\Δ

End if

End while Q

K = k+1; 生成聚类簇C_k = T_old\T

O = O\C_k

End whileO

DBSCAN代码下载链接

ok啦,我选择的是最小距离聚类方法,接下来不废话上代码(Matlab发布形式)

function Main()
clc
clear
close all
%step1
melon_data = load('melon4.0.txt');
melon_data(:,1)=[];
global delta_dist;
global min_pst;
delta_dist = 0.11; min_pst = 5;
object_set = search_objects(melon_data); %ok
%step2
[k_class,cluster_set]= repeat_Objects_clustering(melon_data,object_set);%ok
show(melon_data,cluster_set);
plot(object_set(:,1),object_set(:,2),'ro',...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor','g',...
    'MarkerSize',4)
fprintf('样本密度聚类个数为:%d\n',k_class);
end

subfunction

%step1
function object_set = search_objects(melon_data)
object_set = [];
for i= 1:length(melon_data)
    [is_object, ~] = core_engin(melon_data,melon_data(i,:));
   if is_object % including xi itself
       object_set = [object_set;melon_data(i,:)];
   end
end
end
%core engin
function [is_object, xi_object_samples] = core_engin(melon_data,xi_data)
% judge objects and get object samples
global delta_dist;
global min_pst;
is_object = 0;
xi_dist =  pdist2(melon_data,xi_data);
min_pst_ind= find(xi_dist<=delta_dist);
if length(min_pst_ind) >= min_pst % including xi itself
   is_object =1;
   xi_object_samples = melon_data(min_pst_ind,:);
else
    xi_object_samples =[];
end
end
%step2
function [k_class,cluster_set]= repeat_Objects_clustering(melon_data,object_set)
cluster_set.k_rows =[];
cluster_set.cluster =[];
k=0;
t_data = melon_data;
while ~isempty(object_set)
    t_old_data = t_data; % not visit smample data
    [OS_rows,~] = size(object_set);
    Q = object_set(randi(OS_rows),:);
    del_ind = search_same_data(t_data,Q);
    t_data(del_ind,:)=[];
    while ~isempty(Q)
        [is_object, xi_object_samples] = core_engin(melon_data,Q(1,:));
        if is_object %>=min_pst
            delta_sample= set_across(t_data,xi_object_samples);
            if ~isempty(delta_sample)
                Q =[Q;delta_sample];
                t_data = set_diff(t_data,delta_sample);
            end
        end
        Q(1,:)=[];
    end
 k=k+1;
 cur_cluster = set_diff(t_old_data,t_data);
 object_set = set_diff(object_set,cur_cluster);
 %store
 [cur_cluster_rows,~] = size(cur_cluster);
 cluster_set.k_rows =[cluster_set.k_rows;cur_cluster_rows];
 cluster_set.cluster =[cluster_set.cluster;cur_cluster];
end
k_class = k;
end
function output_data = set_across(act_data,pas_data)
% this function is doing output_data = act_data ∩pas_data
output_data = [];
[PD_rows,~] = size(pas_data);
for i =1:PD_rows
    delta_ind = search_same_data(act_data,pas_data(i,:));
    if ~isempty(delta_ind)
       output_data = [output_data;pas_data(i,:)];
    else
        continue;
    end
end

end

function output_data = set_diff(act_data,pas_data)
%this function is set operation  : output_data = act_data\pas_data去除操作
[m,~] = size(pas_data);
for i= 1:m
    delta_ind = search_same_data(act_data,pas_data(i,:));
    if ~isempty(delta_ind)
       act_data(delta_ind,:) =[];
    else
        continue;
    end
end
output_data = act_data;
end

function zero_ind = search_same_data(data,xi_data)
    dist = pdist2(data,xi_data);
    zero_ind = find(dist==0);
end


function show(melon_data,cluster_set)
plot(melon_data(:,1),melon_data(:,2),'+b');
hold on
cum_rows = cumsum(cluster_set.k_rows);
plot(cluster_set.cluster(1:cum_rows(1),1),cluster_set.cluster(1:cum_rows(1),2),'or');
plot(cluster_set.cluster(cum_rows(1)+1:cum_rows(2),1),cluster_set.cluster(cum_rows(1)+1:cum_rows(2),2),'sg');
plot(cluster_set.cluster(cum_rows(2)+1:cum_rows(3),1),cluster_set.cluster(cum_rows(2)+1:cum_rows(3),2),'^k');
plot(cluster_set.cluster(cum_rows(3)+1:end,1),cluster_set.cluster(cum_rows(3)+1:end,2),'pm');
xlabel('density');ylabel('sugar rate');
end
样本密度聚类个数为:4

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聚类算法4——DBSCAN密度聚类(算法步骤及matlab代码) 的相关文章

随机推荐

  • 利用Python实现一组数的最大公约数

    我先用求三个整数的最大公约数为例 首先利用for循环来进行判断这三个整数可以被那些数整除 代码如下 x y z eval input 请输入三个整数 用逗号隔开 ma max x y z ls for i in range 2 ma a x
  • 【MQTT】MQTT协议学习

    文章目录 MQTT协议 简述 特点 MQTT消息的QoS 服务质量 MQTT支持三种QoS等级 协议实现方式 MQTT协议数据包 控制报文 结构 MQTT固定头 MQTT数据包类型 标识位 剩余长度 Remaining Length MQT
  • Sqlserver 监控使用磁盘空间情况

    最近遇到一个小问题 为了保存以往的一些数据 间了大量临时表 导致SQLserver 数据增长过快 不得不想个办法监控磁盘空间使用情况 网上一般有几种办法 一是使用 dm os volume stats函数 缺点是 无法获取非数据库所在的磁盘
  • Service Bus Namespace 和 Access Control

    Service Bus Namespace 和 Access Control Service Bus Namespace简述 https yourapp servicebus windows net foo bar baz 就是一个name
  • 【必看】时序逻辑仿真成组合逻辑?你知道原因吗?

    对于初学者 一般会遇到这种情况 明明写的时序逻辑 结果仿真结果却是组合逻辑 然后看遍设计代码 始终找不到原因 交流群 知乎这种问题随处可见 但不要怀疑软件问题 modelsim这些专用软件基本不会遇见软件自身问题 原因其实很简单 因为多数人
  • 常用内存数据库介绍(四)

    4 5 H2 Database h2是Thomas Mueller提供的一个开源的 纯java实现的关系数据库 官方网站 http www h2database com html main html 它的主要特性是 非常速的数据库引擎 开源
  • 《算法图解》总结第 7 章:狄克斯特拉算法

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快
  • mac safari无法打开网页_Safari浏览器无法打开网页,因为您的iphone尚未接入互联网...

    原因如下 1 移动数据没打开 如果苹果手机出现游览器无法打开网页 我们专首先要查看手机上面网络属数据是否开启 如果忘记开启网络数据的话 那么没有网络也就无法打开访问网页 这个时候 打开系统设置将蜂窝移动数据按钮打开 即可解决这个问题 2 检
  • FastCGI sent in stderr: “Primary script unknown“ while reading response header from upstream问题解决

    error 1439 1439 5 FastCGI sent in stderr Primary script unknown while reading response header from upstream php对接nginx的配
  • wifi 概念

    wifi 的一些概念 转载 http blog csdn net eager7 article details 8117600 python view plain copy 1 什么是WIFI Wi Fi 原先是无线保真的缩写 Wi Fi
  • html中哪些是行内元素,html行内元素有哪些

    html行内元素有 a b u span img input strong select sub sup label em button textarea tt var samp br cite code font strike等等 本教程
  • layui文件上传后台(带自定参数)

    记录layui文件上传方法 前端页面直接看layui文件上传相关文档就行 主要是记录后端Java接收上传流并保存的方法 layui文档 https www layui com doc modules upload html 因为该方法使用M
  • [BSidesSF2019]goodluks

    BSidesSF2019 goodluks 考点 题解过程 flag 考点 1 EFF 骰子密码 2 Linux删除的文件恢复 3 LUKS加密 题解过程 开局给了一张图片和一个img的文件 首先使用查看镜像的文件内容 是一个MBR的启动项
  • matlab非线性规划

    1 非线性规划matlab函数 非线性规划函数的约束函数和目标函数至少有一个是非线性函数 而对比于线性规划的区别也就一眼识别了 MATLAB中用于求解非线性规划的函数为fmincon 其调用格式如下 x fmincon f x0 A b x
  • java调用webservice接口 几种方法

    webservice的 发布一般都是使用WSDL web service descriptive language 文件的样式来发布的 在WSDL文件里面 包含这个webservice暴露在外面可供使用的接口 今天搜索到了非常好的 webs
  • python数据预处理之缺失值的各种填补方式

    如果你觉得文字看着枯燥 可以看配套讲解视频 讲解视频 对于数据挖掘的缺失值的处理 应该是在数据预处理阶段应该首先完成的事 缺失值的处理一般情况下有三种方式 1 删掉缺失值数据 2 不对其进行处理 3 利用插补法对数据进行补充 第一种方式是极
  • 修改 bootargs 方式增加分区(mtd分区和blkdevparts分区)

    1 Linux内核设置分区的两种方式 1 1 内核代码中写死 在内核的平台代码中写死 然后在初始化NandFlash的时候设置 1 2 uboot通过bootargs传递分区表 1 u boot将分区信息 形如 mtdparts xxx b
  • 机器学习之逻辑回归,代码实现(附带sklearn代码,小白版)

    文章目录 前言 一 逻辑回归能够解决什么 二 公式 三 激活函数 四 如何求得w 六 逻辑回归代码实现 五 sklearn demo 总结 前言 虽然名字带有回归 但实际上是一个常用的二分类算法 并且在预测的时候能够提供预测类别的概率 一
  • antd中Form.useForm()使用方式

    这里写自定义目录标题 onRow 表单Form useForm onRow table table record 点击后获取的数据对象 onRow record gt return event获取当前列元素节点 可用 event targe
  • 聚类算法4——DBSCAN密度聚类(算法步骤及matlab代码)

    看了西关书的聚类算法 算法原理很容易明白 接下来就是整理成自己的理解思路 然后一步一步来实现算法 那么就来做吧 DensityClustering算法 概念 从样本密度的角度考察样本之间的可连接性 样本分布的紧密程度刻画聚类结构 术语 核心