基于密度的聚类之Dbscan算法
一.算法概述
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类(笔者认为是因为他不是基于距离的,基于距离的发现的是球状簇)。
该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值。DBSCAN算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。但是由于它直接对整个数据库进行操作且进行聚类时使用了一个全局性的表征密度的参数,因此也具有两个比较明显的弱点:
(1)当数据量增大时,要求较大的内存支持I/O消耗也很大;
(2)当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差(有些簇内距离较小,有些簇内距离很大,但是Eps是确定的,所以,大的点可能被误判断为离群点或者边界点,如果Eps太大,那么小距离的醋内,可能会包含一些离群点或者边界点,KNN的k也存在同样的问题)。
(1)与K-MEANS比较起来,不需要输入要划分的聚类个数;
(2)聚类簇的形状没有偏倚(这个不明白啥意思);
(3)可以在需要时输入过滤噪声的参数;
二.算法基本定义
三.算法描述
3.1 算法前提
DBSCAN算法基于一个事实:一个聚类可以由其中的任何核心对象唯一确定。等价可以表述为:任一满足核心对象条件的数据对象p,数据库D中所有从p密度可达的数据对象o所组成的集合构成了一个完整的聚类C,且p属于C。
3.2 算法流程
四.算法实现
- %% DBSCAN
- clear all;
- clc;
- %% 导入数据集
- % data = load('testData.txt');
- data = randn(50,2);
- % 定义参数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
么么哒.............
- 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);
注意:prod是数组内元素的乘积,A^n是A*A*....*A,A.^n是A中每个元素的n次方。
基于密度的聚类之Dbscan算法的更多相关文章
- 【机器学习】DBSCAN Algorithms基于密度的聚类算法
一.算法思想: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层 ...
- 简单易学的机器学习算法—基于密度的聚类算法DBSCAN
简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. ...
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
一.基于密度的聚类算法的概述 最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...
- DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式
一.DBSCAN聚类概述 基于密度的方法的特点是不依赖于距离,而是依赖于密度,从而克服基于距离的算法只能发现"球形"聚簇的缺点. DBSCAN的核心思想是从某个核心点出发,不断向密 ...
- R与数据分析旧笔记(十六) 基于密度的方法:DBSCAN
基于密度的方法:DBSCAN 基于密度的方法:DBSCAN DBSCAN=Density-Based Spatial Clustering of Applications with Noise 本算法 ...
- 聚类:层次聚类、基于划分的聚类(k-means)、基于密度的聚类、基于模型的聚类
一.层次聚类 1.层次聚类的原理及分类 1)层次法(Hierarchicalmethods)先计算样本之间的距离.每次将距离最近的点合并到同一个类.然后,再计算类与类之间的距离,将距离最近的类合并为一 ...
- 机器学习--聚类系列--DBSCAN算法
DBSCAN算法 基本概念:(Density-Based Spatial Clustering of Applications with Noise) 核心对象:若某个点的密度达到算法设定的阈值则其为 ...
- 聚类之dbscan算法
简要的说明: dbscan为一个密度聚类算法,无需指定聚类个数. python的简单实例: # coding:utf-8 from sklearn.cluster import DBSCAN impo ...
- 基于密度聚类的DBSCAN和kmeans算法比较
根据各行业特性,人们提出了多种聚类算法,简单分为:基于层次.划分.密度.图论.网格和模型的几大类. 其中,基于密度的聚类算法以DBSCAN最具有代表性. 场景 一 假设有如下图的一组数据, 生成数据 ...
随机推荐
- oracle生成.net的guid方法;
最近在做一个T1的.NET项目,数据库oracle的时候,遇到一个问题..NET里面的某个数据库表类的某个字段是guid类型.但是用oracle生成的guid.跟.NET的guid 无法识别.导致报错 ...
- [老老实实学WCF] 第六篇 元数据交换
老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个 终结点上建立通道从而进 ...
- iOS - 数组(NSArray)
1. 数组的常用处理方式 //--------------------不可变数组 //1.数组的创建 NSString *s1 = @"zhangsan"; NSString *s ...
- springside出现Description Resource Path Location Type
<?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.sp ...
- 9 款赏心悦目的 HTML5/CSS3 特效
1.HTML5 WebGL实验,超酷的HTML5 Canvas波浪墙 这是一款HTML5 Canvas实验项目,也是波浪特效,只是这不是真正的水波,而是利用柱体高度的变化实现的波浪墙效果. 在线演示 ...
- Linux系统目录分析
Linux系统目录分析 /bin :系统指令目录(如ls.cp.mv等指令) /dev :系统设备目录 /home :系统用户的家,每一个系统用户都在此目录下有一个自己的家,每次登录时,系统都会自动登 ...
- eclipse下的Tomcat安装与web项目 搭建
Tomcat 安装 环境: win10-64位 apache-tomcat-7.0.57-windows-x64 首先要配置Windows 的环境变量 JAVA_HOME(就是Java的环境变量) ...
- Codevs 2833 奇怪的梦境
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还 ...
- ZigBee协议基本介绍
ZigBee是一种短距离(10~100米).低速率(20~250Kbps).底成本.低功耗的无线网络技术,主要用于近离无线通讯.能够做到在数千个微小的传感器之间相互协调实现通讯,这些传感器只需要很少的 ...
- VC按钮控件实现指示灯效果
VC为按钮控件添加图片的方法有很多种: 直接调用SetBitmap: CButton pButton->SetBitmap(hBitmap); 使用CButtonST控件: 使用CDC: 使用 ...