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

一、基于密度的聚类算法的概述

我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别。

   
基于密度的聚类算法主要的目标是寻找被低密度区域分离的高密度区域。与基于距离的聚类算法不同的是,基于距离的聚类算法的聚类结果是球状的簇,而基于密度的聚类算法可以发现任意形状的聚类,这对于带有噪音点的数据起着重要的作用。

二、DBSCAN算法的原理

1、基本概念

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

核心点。在半径Eps内含有超过MinPts数目的点

边界点。在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内

噪音点。既不是核心点也不是边界点的点

在这里有两个量,一个是半径Eps,另一个是指定的数目MinPts。

   
一些其他的概念

Eps邻域。简单来讲就是与点p的距离小于等于Eps的所有的点的集合,可以表示为

直接密度可达。如果p在核心对象q的Eps邻域内,则称对象p从对象q出发是直接密度可达的。

密度可达。对于对象链:是从关于Eps和MinPts直接密度可达的,则对象是从对象关于Eps和MinPts密度可达的。

2、算法流程



(流程)

三、实验仿真

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



(数据集1)



(数据集2)

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



MATLAB代码

主程序





[plain] view plain copy 在CODE上查看代码片派生到我的代码片

%% 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  



距离计算函数

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

%% 计算矩阵中点与点之间的距离  

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函数

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

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);
 



最终的结果



(数据集1的聚类结果)



(数据集2的聚类结果)

在上面的结果中,红色的点代表的是噪音点,点代表的是边界点,十字代表的是核心点。不同的颜色代表着不同的类。数据分析师培训

简单易学的机器学习算法—基于密度的聚类算法DBSCAN的更多相关文章

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

    一.基于密度的聚类算法的概述     最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...

  2. 【机器学习】DBSCAN Algorithms基于密度的聚类算法

    一.算法思想: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层 ...

  3. 基于密度的聚类之Dbscan算法

    一.算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层次 ...

  4. DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式

    一.DBSCAN聚类概述 基于密度的方法的特点是不依赖于距离,而是依赖于密度,从而克服基于距离的算法只能发现"球形"聚簇的缺点. DBSCAN的核心思想是从某个核心点出发,不断向密 ...

  5. 简单易学的机器学习算法——EM算法

    简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...

  6. 简单易学的机器学习算法—SVD奇异值分解

    简单易学的机器学习算法-SVD奇异值分解 一.SVD奇异值分解的定义     假设M是一个的矩阵,如果存在一个分解: 其中的酉矩阵,的半正定对角矩阵,的共轭转置矩阵,且为的酉矩阵.这样的分解称为M的奇 ...

  7. 聚类:层次聚类、基于划分的聚类(k-means)、基于密度的聚类、基于模型的聚类

    一.层次聚类 1.层次聚类的原理及分类 1)层次法(Hierarchicalmethods)先计算样本之间的距离.每次将距离最近的点合并到同一个类.然后,再计算类与类之间的距离,将距离最近的类合并为一 ...

  8. SIGAI机器学习第二十四集 聚类算法1

    讲授聚类算法的基本概念,算法的分类,层次聚类,K均值算法,EM算法,DBSCAN算法,OPTICS算法,mean shift算法,谱聚类算法,实际应用. 大纲: 聚类问题简介聚类算法的分类层次聚类算法 ...

  9. 密度峰值聚类算法(DPC)

    密度峰值聚类算法(DPC) 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 简介 基于密度峰值的聚类算法全称为基于快速搜索和发现密度峰值的聚类算法(cl ...

随机推荐

  1. HttpClient 使用案例

    package com.qifeng.config.ygx.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fas ...

  2. js--判断当前环境是否为app环境

    /** *判断是否是app环境 */ function getIsApp () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/ ...

  3. 关于Delphi中的字符串的详细分析

    关于Delphi中的字符串的详细分析   只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(S ...

  4. Docker系列(三):Docker自定义容器镜像

    将容器编程镜像: docker commit [repo:tag] 网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具.修改配置,如果不做commit保存 起来,那么co ...

  5. mybatis中处理结果集映射

    单行结果集映射: 接口中方法返回值定义为Map类型,sql语句的resultType属性设置为map即可.这种情况默认把列名作为key,列中的值作为value. 也就是说用map<Strirng ...

  6. <每日一题>算法题:集合求并集并排序

    题目描述 给你两个集合,要求{A} + {B}. 注:同一个集合中不会有两个相同的元素. 输入描述: 每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集 ...

  7. 面试系列19 redis的雪崩和穿透

    缓存雪崩发生的现象 缓存雪崩的事前事中事后的解决方案 事前:redis高可用,主从+哨兵,redis cluster,避免全盘崩溃 事中:本地ehcache缓存 + hystrix限流&降级, ...

  8. vue 图片懒加载v-lazy

    搬运自:https://blog.csdn.net/twodogya/article/details/80223331 vue v-lazy官方API:https://www.npmjs.com/pa ...

  9. QTableView的indexAt使用方法

    要实现的功能是QTableview中Item项上右键弹出菜单这就必然要判断点击右键时鼠标指针是否在QTableView的Item上 如果是QTableWidget可以用itemAt来判断QTableV ...

  10. angularjs 1 Failed to read the 'selectionStart' property from 'HTMLInputElement':

    在找angularjs input(type='number')在获取焦点的时候,文本框内容选中效果,参考了:Select text on input focus,我直接复制他的code之后,在ion ...