简单易学的机器学习算法——基于密度的聚类算法DBSCAN

简单易学的机器学习算法——基于密度的聚类算法DBSCAN

一、基于密度的聚类算法的概述      最近在Science上的一篇基于密度的聚类算法《Clustering by fast search and find of density peaks》引起了大家的关注(在我的博文“”中也进行了中文的描述)。于是我就想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别。       基于密度的聚类算法主要的目标是寻找被低密度区域分离的高密度区域。与基于距离的聚类算法不同的是,基于距离的聚类算法的聚类结果是球状的簇,而基于密度的聚类算法可以发现任意形状的聚类,这对于带有噪音点的数据起着重要的作用。

二、DBSCAN算法的原理

1、基本概念      DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一种典型的基于密度的聚类算法,在DBSCAN算法中将数据点分为一下三类:

  • 核心点。在半径Eps内含有超过MinPts数目的点
  • 边界点。在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
  • 噪音点。既不是核心点也不是边界点的点 在这里有两个量,一个是半径Eps,另一个是指定的数目MinPts。       一些其他的概念
  1. Eps邻域。简单来讲就是与点
www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

的距离小于等于Eps的所有的点的集合,可以表示为

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

  1. 直接密度可达。如果
www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

在核心对象

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

的Eps邻域内,则称对象

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

从对象

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

出发是直接密度可达的。

  1. 密度可达。对于对象链:
www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

是从

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

关于Eps和MinPts直接密度可达的,则对象

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

是从对象

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

关于Eps和MinPts密度可达的。

2、算法流程

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN


   (流程)

三、实验仿真      在实验中使用了两个测试数据集,数据集的原始图像如下:

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN


   (数据集1)

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

(数据集2)   数据集1相对比较简单。显然我们可以发现数据集1共有两个类,数据集2有四个类,下面我们通过DBSCAN算法实现数据点的聚类:  
   MATLAB代码   主程序  
 

%% DBSCAN
clear all;
clc;

%% 导入数据集
% data = load('testData.txt');
data = load('testData_2.txt');

% 定义参数Eps和MinPts
MinPts = 5;
Eps = epsilon(data, MinPts);

[m,n] = size(data);%得到数据的大小

x = [(1:m)' data];
[m,n] = size(x);%重新计算数据集的大小
types = zeros(1,m);%用于区分核心点1,边界点0和噪音点-1
dealed = zeros(m,1);%用于判断该点是否处理过,0表示未处理过
dis = calDistance(x(:,2:n));
number = 1;%用于标记类

%% 对每一个点进行处理
for i = 1:m
    %找到未处理的点
    if dealed(i) == 0
        xTemp = x(i,:);
        D = dis(i,:);%取得第i个点到其他所有点的距离
        ind = find(D<=Eps);%找到半径Eps内的所有点
        
        %% 区分点的类型
        
        %边界点
        if length(ind) > 1 && length(ind) < MinPts+1
            types(i) = 0;
            class(i) = 0;
        end
        %噪音点
        if length(ind) == 1
            types(i) = -1;
            class(i) = -1;
            dealed(i) = 1;
        end
        %核心点(此处是关键步骤)
        if length(ind) >= MinPts+1
            types(xTemp(1,1)) = 1;
            class(ind) = number;
            
            % 判断核心点是否密度可达
            while ~isempty(ind)
                yTemp = x(ind(1),:);
                dealed(ind(1)) = 1;
                ind(1) = [];
                D = dis(yTemp(1,1),:);%找到与ind(1)之间的距离
                ind_1 = find(D<=Eps);
                
                if length(ind_1)>1%处理非噪音点
                    class(ind_1) = number;
                    if length(ind_1) >= MinPts+1
                        types(yTemp(1,1)) = 1;
                    else
                        types(yTemp(1,1)) = 0;
                    end
                    
                    for j=1:length(ind_1)
                       if dealed(ind_1(j)) == 0
                          dealed(ind_1(j)) = 1;
                          ind=[ind ind_1(j)];   
                          class(ind_1(j))=number;
                       end                    
                   end
                end
            end
            number = number + 1;
        end
    end
end

% 最后处理所有未分类的点为噪音点
ind_2 = find(class==0);
class(ind_2) = -1;
types(ind_2) = -1;

%% 画出最终的聚类图
hold on
for i = 1:m
    if class(i) == -1
        plot(data(i,1),data(i,2),'.r');
    elseif class(i) == 1
        if types(i) == 1
            plot(data(i,1),data(i,2),'+b');
        else
            plot(data(i,1),data(i,2),'.b');
        end
    elseif class(i) == 2
        if types(i) == 1
            plot(data(i,1),data(i,2),'+g');
        else
            plot(data(i,1),data(i,2),'.g');
        end
    elseif class(i) == 3
        if types(i) == 1
            plot(data(i,1),data(i,2),'+c');
        else
            plot(data(i,1),data(i,2),'.c');
        end
    else
        if types(i) == 1
            plot(data(i,1),data(i,2),'+k');
        else
            plot(data(i,1),data(i,2),'.k');
        end
    end
end
hold off


   距离计算函数

%% 计算矩阵中点与点之间的距离
function [ dis ] = calDistance( x )
    [m,n] = size(x);
    dis = zeros(m,m);
    
    for i = 1:m
        for j = i:m
            %计算点i和点j之间的欧式距离
            tmp =0;
            for k = 1:n
                tmp = tmp+(x(i,k)-x(j,k)).^2;
            end
            dis(i,j) = sqrt(tmp);
            dis(j,i) = dis(i,j);
        end
    end
end


epsilon函数

function [Eps]=epsilon(x,k)

% Function: [Eps]=epsilon(x,k)
%
% Aim: 
% Analytical way of estimating neighborhood radius for DBSCAN
%
% Input: 
% x - data matrix (m,n); m-objects, n-variables
% k - number of objects in a neighborhood of an object
% (minimal number of objects considered as a cluster)



[m,n]=size(x);

Eps=((prod(max(x)-min(x))*k*gamma(.5*n+1))/(m*sqrt(pi.^n))).^(1/n);



   
 最终的结果

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN


    (数据集1的聚类结果)

www.zeeklog.com  - 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

(数据集2的聚类结果)    在上面的结果中,红色的点代表的是噪音点,点代表的是边界点,十字代表的是核心点。不同的颜色代表着不同的类。

参考文献  [1] M. Ester, H. Kriegel, J. Sander, X. Xu, A density-based algorithm for discovering clusters in large spatial databases with noise,  www.dbs.informatik.uni-muenchen.de/cgi-bin/papers?query=--CO
[2] M. Daszykowski, B. Walczak, D. L. Massart, Looking for Natural Patterns in Data. Part 1: Density Based Approach

Read more

决策树算法介绍:原理与案例实现

决策树算法介绍:原理与案例实现

决策树算法介绍:原理与案例实现 决策树算法介绍:原理与案例实现 一、决策树算法概述 决策树是一种基本的分类与回归方法,它基于树形结构进行决策。决策树的每一个节点都表示一个对象属性的测试,每个分支代表该属性测试的一个输出,每个叶节点则代表一个类别或值。决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的剪枝。 二、决策树算法原理 1. 特征选择 特征选择是决策树学习的核心。它决定了在树的每个节点上选择哪个属性进行测试。常用的特征选择准则有信息增益、增益比和基尼不纯度。 * 信息增益:表示划分数据集前后信息的不确定性减少的程度。选择信息增益最大的属性作为当前节点的测试属性。 * 增益比:在信息增益的基础上考虑了属性的取值数量,避免了对取值数量较多的属性的偏好。 * 基尼不纯度:在CART(分类与回归树)算法中,使用基尼不纯度作为特征选择的准则。基尼不纯度越小,表示纯度越高。 2. 决策树的生成 根据选择的特征选择准则,从根节点开始,递归地为每个节点选择最优的划分属性,并根据该属性的不同取值建立子节点。直到满足停止条件(如所有样本属于同一类,

By Ne0inhk
他给女朋友做了个树莓派复古相机,算法代码可自己编写,成本不到700元

他给女朋友做了个树莓派复古相机,算法代码可自己编写,成本不到700元

手机拍照不够爽,带个单反又太重? 试试做个树莓派复古相机,还能自己编写处理算法的那种—— 成本不到700元。 没错,颜值很高,拍出来的照片也能打: 你也可以快速上手做一个。 如何制作一个树莓派复古相机 目前,这部相机的代码、硬件清单、STL文件(用于3D打印)和电路图都已经开源。 首先是硬件部分。 这部复古相机的硬件清单如下: 树莓派Zero W(搭配microSD卡)、树莓派高清镜头模组、16mm 1000万像素长焦镜头、2.2英寸TFT显示屏、TP4056微型USB电池充电器、MT3608、2000mAh锂电池、电源开关、快门键、杜邦线、3D打印相机外壳、黑色皮革贴片(选用) 至于3D打印的相机外壳,作者已经开源了所需的STL文件,可以直接上手打印。 材料齐全后,就可以迅速上手制作了~ 内部的电路图,是这个样子的: 具体引脚如下: 搭建好后,整体电路长这样: 再加上3D外壳(喷了银色的漆)和镜头,一部简易的树莓派复古相机就做好了。 至于软件部分,

By Ne0inhk
🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

是一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器。 集成了 SearXNG AI 搜索、开发工具集合、 市面上最流行的 AI 工具门户,以及代码编写和桌面快捷工具等功能, 通过模块化的 Monorepo 架构,提供轻量级、可扩展且高效的桌面体验, 助力 AI 驱动的日常工作流程。

By Ne0inhk