简单易学的机器学习算法——基于密度的聚类算法DBSCAN
一、基于密度的聚类算法的概述
二、DBSCAN算法的原理
1、基本概念
- 核心点。在半径Eps内含有超过MinPts数目的点
- 边界点。在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
- 噪音点。既不是核心点也不是边界点的点
在这里有两个量,一个是半径Eps,另一个是指定的数目MinPts。
- Eps邻域。简单来讲就是与点
的距离小于等于Eps的所有的点的集合,可以表示为
。
- 直接密度可达。如果
在核心对象
的Eps邻域内,则称对象
从对象
出发是直接密度可达的。
- 密度可达。对于对象链:
,
是从
关于Eps和MinPts直接密度可达的,则对象
是从对象
关于Eps和MinPts密度可达的。
2、算法流程
三、实验仿真
- %% 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);
最终的结果
参考文献
[2] M. Daszykowski, B. Walczak, D. L. Massart, Looking for Natural Patterns in Data. Part 1: Density Based Approach
简单易学的机器学习算法——基于密度的聚类算法DBSCAN的更多相关文章
- 简单易学的机器学习算法—基于密度的聚类算法DBSCAN
简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. ...
- 【机器学习】DBSCAN Algorithms基于密度的聚类算法
一.算法思想: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层 ...
- 基于密度的聚类之Dbscan算法
一.算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层次 ...
- DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式
一.DBSCAN聚类概述 基于密度的方法的特点是不依赖于距离,而是依赖于密度,从而克服基于距离的算法只能发现"球形"聚簇的缺点. DBSCAN的核心思想是从某个核心点出发,不断向密 ...
- 简单易学的机器学习算法——EM算法
简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...
- 简单易学的机器学习算法—SVD奇异值分解
简单易学的机器学习算法-SVD奇异值分解 一.SVD奇异值分解的定义 假设M是一个的矩阵,如果存在一个分解: 其中的酉矩阵,的半正定对角矩阵,的共轭转置矩阵,且为的酉矩阵.这样的分解称为M的奇 ...
- 聚类:层次聚类、基于划分的聚类(k-means)、基于密度的聚类、基于模型的聚类
一.层次聚类 1.层次聚类的原理及分类 1)层次法(Hierarchicalmethods)先计算样本之间的距离.每次将距离最近的点合并到同一个类.然后,再计算类与类之间的距离,将距离最近的类合并为一 ...
- SIGAI机器学习第二十四集 聚类算法1
讲授聚类算法的基本概念,算法的分类,层次聚类,K均值算法,EM算法,DBSCAN算法,OPTICS算法,mean shift算法,谱聚类算法,实际应用. 大纲: 聚类问题简介聚类算法的分类层次聚类算法 ...
- 密度峰值聚类算法(DPC)
密度峰值聚类算法(DPC) 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 简介 基于密度峰值的聚类算法全称为基于快速搜索和发现密度峰值的聚类算法(cl ...
随机推荐
- IoGetTopLevelIrp
学习写驱动,其实,挺无聊,但是也挺有意思的 IoGetTopLevelIrp 今天在看一个文件系统过滤驱动的时候,看到这个函数,它是干嘛的,为什么会有这么个东西 https://msdn.micros ...
- pywebview gui='cef' 生成app报错—— 中断点 已到达中断点
pywebview是一个轻量级跨平台包装器,允许在其自己的本机GUI窗口中显示HTML内容.它提供了桌面应用程序中Web技术的强大功能,隐藏了GUI基于浏览器的事实.这个玩意儿好啊,可以直接让我们做的 ...
- 13-8-return的高级使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- webpack用了manifest为何还是每次都生成新的vendor?
原来的代码 //用于提取公共代码 new webpack.optimize.CommonsChunkPlugin({ //记得要在开头引入webpack names: ['vendor','manif ...
- 关于IOC
1. [调侃]IOC前世今生 http://www.cnblogs.com/showjan/p/3950989.html#!comments 2. 使用ConfigurationManager类 读写 ...
- 18多校8th
a-容斥原理(带限制的不定方程) #include<bits/stdc++.h> using namespace std; #define mod 998244353 #define ll ...
- Windows进程创建的流程分析
. 创建进程的大体流程: 创建进程的过程就是构建一个环境,这个环境包含了很多的机制 (比如自我保护, 与外界通信等等). 构建这个环境需要两种"人"来协调完成(用户态和内核 ...
- 利用IDEA构建springboot应用--controller例子
微服务 微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务.一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议. ...
- 组件:基础的基础组件(Component,Portlet)
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- Catenyms (POJ2337) 字典序最小欧拉路
// 很久不写图论,连模板也不熟悉了0.0 // 这题是一个技巧性比较高的暴力DFS Catenyms 题目大意 定义catenym为首尾字母相同的单词组成的单词对, 例如: dog.gopher g ...