机器学习聚类算法之DBSCAN
一、概念
DBSCAN是一种基于密度的聚类算法,DBSCAN需要两个参数,一个是以P为中心的邻域半径;另一个是以P为中心的邻域内的最低门限点的数量,即密度。
优点:
1、不需要提前设定分类簇数量,分类结果更合理;
2、可以有效的过滤干扰。
缺点:
1、对高维数据处理效果较差;
2、算法复杂度较高,资源消耗大于K-means。
二、计算
1、默认使用第一个点作为初始中心;
2、通过计算点到中心的欧氏距离和领域半径对比,小于则是邻域点;
3、计算完所有点,统计邻域内点数量,小于于最低门限点数量则为噪声;
4、循环统计各个点的邻域点数,只要一直大于最低门限点数量,则一直向外扩展,直到不再大于。
5、一个簇扩展完成,会从剩下的点中重复上述操作,直到所有点都被遍历。
三、实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt cs = ['black', 'blue', 'brown', 'red', 'yellow', 'green'] class NpCluster(object):
def __init__(self):
self.key = []
self.value = [] def append(self, data):
if str(data) in self.key:
return
self.key.append(str(data))
self.value.append(data) def exist(self, data):
if str(data) in self.key:
return True
return False def __len__(self):
return len(self.value) def __iter__(self):
self.times = 0
return self def __next__(self):
try:
ret = self.value[self.times]
self.times += 1
return ret
except IndexError:
raise StopIteration() def create_sample():
np.random.seed(10) # 随机数种子,保证随机数生成的顺序一样
n_dim = 2
num = 100
a = 3 + 5 * np.random.randn(num, n_dim)
b = 30 + 5 * np.random.randn(num, n_dim)
c = 60 + 10 * np.random.randn(1, n_dim)
data_mat = np.concatenate((np.concatenate((a, b)), c))
ay = np.zeros(num)
by = np.ones(num)
label = np.concatenate((ay, by))
return {'data_mat': list(data_mat), 'label': label} def region_query(dataset, center_point, eps):
result = NpCluster()
for point in dataset:
if np.sqrt(sum(np.power(point - center_point, 2))) <= eps:
result.append(point)
return result def dbscan(dataset, eps, min_pts):
noise = NpCluster()
visited = NpCluster()
clusters = []
for point in dataset:
cluster = NpCluster()
if not visited.exist(point):
visited.append(point)
neighbors = region_query(dataset, point, eps)
if len(neighbors) < min_pts:
noise.append(point)
else:
cluster.append(point)
expand_cluster(visited, dataset, neighbors, cluster, eps, min_pts)
clusters.append(cluster)
for data in clusters:
print(data.value)
plot_data(np.mat(data.value), cs[clusters.index(data)])
if noise.value:
plot_data(np.mat(noise.value), 'green')
plt.show() def plot_data(samples, color, plot_type='o'):
plt.plot(samples[:, 0], samples[:, 1], plot_type, markerfacecolor=color, markersize=14) def expand_cluster(visited, dataset, neighbors, cluster, eps, min_pts):
for point in neighbors:
if not visited.exist(point):
visited.append(point)
point_neighbors = region_query(dataset, point, eps)
if len(point_neighbors) >= min_pts:
for expand_point in point_neighbors:
if not neighbors.exist(expand_point):
neighbors.append(expand_point)
if not cluster.exist(point):
cluster.append(point) init_data = create_sample()
dbscan(init_data['data_mat'], 10, 3)
聚类结果:

可以看到,点被很好的聚类为两个簇,右上角是噪声。
机器学习聚类算法之DBSCAN的更多相关文章
- 机器学习 - 算法 - 聚类算法 K-MEANS / DBSCAN算法
聚类算法 概述 无监督问题 手中无标签 聚类 将相似的东西分到一组 难点 如何 评估, 如何 调参 基本概念 要得到的簇的个数 - 需要指定 K 值 质心 - 均值, 即向量各维度取平均 距离的度量 ...
- 机器学习聚类算法之K-means
一.概念 K-means是一种典型的聚类算法,它是基于距离的,是一种无监督的机器学习算法. K-means需要提前设置聚类数量,我们称之为簇,还要为之设置初始质心. 缺点: 1.循环计算点到质心的距离 ...
- Standford机器学习 聚类算法(clustering)和非监督学习(unsupervised Learning)
聚类算法是一类非监督学习算法,在有监督学习中,学习的目标是要在两类样本中找出他们的分界,训练数据是给定标签的,要么属于正类要么属于负类.而非监督学习,它的目的是在一个没有标签的数据集中找出这个数据集的 ...
- 【Python机器学习实战】聚类算法(1)——K-Means聚类
实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...
- 【转】常用聚类算法(一) DBSCAN算法
原文链接:http://www.cnblogs.com/chaosimple/p/3164775.html#undefined 1.DBSCAN简介 DBSCAN(Density-Based Spat ...
- 常用聚类算法(一) DBSCAN算法
1.DBSCAN简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度 ...
- 关于k-means聚类算法的matlab实现
在数据挖掘中聚类和分类的原理被广泛的应用. 聚类即无监督的学习. 分类即有监督的学习. 通俗一点的讲就是:聚类之前是未知样本的分类.而是根据样本本身的相似性进行划分为相似的类簇.而分类 是已知样本分类 ...
- 简单易学的机器学习算法—基于密度的聚类算法DBSCAN
简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. ...
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
一.基于密度的聚类算法的概述 最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...
随机推荐
- 兼容ie9以下支持媒体查询和html5
<head> <!-- 让IE8/9支持媒体查询,从而兼容栅格 --> <!--[if lt IE 9]> <script src="https:/ ...
- 【SVN】更新提交失败---- Previous operation has not finished; run 'cleanup' if it was interrupted解决方法
Previous operation has not finished; run 'cleanup' if it was interrupted 问题出处 解决方法 2017-11-01 08: ...
- opencv的频域滤波
下面是频域滤波示例程序: 在本程序中,共有五个自定义函数,分别是: 1. myMagnitude(),在该函数中封装了Opencv中的magnitude函数,实现对于复数图像的幅值计算. 2. dft ...
- 微信分享图标设置,以及wx.config配置
最近公司要求我做一个关于页面分享微信显示小图和描述的功能,由于之前没有做过,所以说是从零开始,看jssdk说明文档,网上搜索各种资料,甚至连三四年前的内容都搜索出来了,也试过以前的简单方法,包括在页面 ...
- maven的各种异常
1. 问题 本文将讨论Spring中最常见的配置问题 —— Spring的一个命名空间的名称空间处理程序没有找到. 大多数情况下,是由于一个特定的Spring的jar没有配置在classpath下,让 ...
- selenium.common.exceptions.WebDriverException: Message: ‘geckodriver’ executable needs to be in PATH
问题,找不到’geckodriver’ 的环境path,解决方案 下载geckodriver.exe 放到Firefox的安装目录下,如:(D:\火狐\Mozilla Firefox): 将火狐安装目 ...
- 关于Eclipse及JDK安装过程中的一些问题
一,环境变量的配置 1.配置CLASSPATH系统变量 CLASSPATH系统变量为类查找路径 ①.在使用javac进行编译时遇到import时候就会通过这个变量里面配置的路径去查找.如果配置的是目录 ...
- Java实验报告四
一.实验目的 (1)掌握类的继承方法: (2)变量的继承和覆盖,方法的继承.重载和覆盖实现: 二.实验内容 1)实验代码 import java.util.Scanner; public class ...
- 使用自定义View
1 关于自定义的View的构造函数 java中对构造函数只是调用,不继承.因为整个UI是android系统提供的框架,因此构造函数需要写成它要求的格式,即和View的构造函数一样. 自定义的View中 ...
- linux信号调用机制
在Linux中,信号是进程间通讯的一种方式,它采用的是异步机制.当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行. 需要说明的 ...