DBSCAN密度聚类
1. 密度聚类概念
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。
2. 密度聚类步骤
这个算法的关键是理解几个概念:
- 直接密度可达
- 密度可达
- 核心点
- 边界点
- 噪声点

# coding:utf-8
"""
@author = LPS
"""
import numpy as np
import matplotlib.pyplot as plt data = np.loadtxt('moon.txt')
n,m = data.shape
all_index = np.arange(n)
dis = np.zeros([n,n])
data = np.delete(data, m-1, axis=1) def dis_vec(a,b): # 计算两个向量的距离 if len(a)!=len(b):
return Exception
else:
return np.sqrt(np.sum(np.square(a-b))) for i in range(n): # 计算距离矩阵
for j in range(i):
dis[i,j] = dis_vec(data[i],data[j])
dis[j,i] = dis[i,j] def dbscan(s, minpts): # 密度聚类 center_points = [] # 存放最终的聚类结果
k = 0 # 检验是否进行了合并过程 for i in range(n):
if sum(dis[i] <= s) >= minpts: # 查看距离矩阵的第i行是否满足条件
if len(center_points) == 0: # 如果列表长为0,则直接将生成的列表加入
center_points.append(list(all_index[dis[i] <= s]))
else:
for j in range(len(center_points)): # 查找是否有重复的元素
if set(all_index[dis[i] <= s]) & set(center_points[j]):
center_points[j].extend(list(all_index[dis[i] <= s]))
k=1 # 执行了合并操作
if k==0 :
center_points.append(list(all_index[dis[i] <= s])) # 没有执行合并说明这个类别单独加入
k=0 lenc = len(center_points) # 以下这段代码是进一步查重,center_points中所有的列表并非完全独立,还有很多重复
# 那么为何上面代码已经查重了,这里还需查重,其实可以将上面的步骤统一放到这里,但是时空复杂的太高
# 经过第一步查重后,center_points中的元素数目大大减少,此时进行查重更快!
k = 0
for i in range(lenc-1):
for j in range(i+1, lenc):
if set(center_points[i]) & set(center_points[j]):
center_points[j].extend(center_points[i])
center_points[j] = list(set(center_points[j]))
k=1 if k == 1:
center_points[i] = [] # 合并后的列表置空
k = 0 center_points = [s for s in center_points if s != []] # 删掉空列表即为最终结果 return center_points if __name__ == '__main__':
center_points = dbscan(0.2,10) # 半径和元素数目
c_n = center_points.__len__() # 聚类完成后的类别数目
print (c_n)
ct_point = []
color = ['g','r','b','m','k']
noise_point = np.arange(n) # 没有参与聚类的点即为噪声点
for i in range(c_n):
ct_point = list(set(center_points[i]))
noise_point = set(noise_point)- set(center_points[i])
print (ct_point.__len__()) # 输出每一类的点个数
print (ct_point) # 输出每一类的点
print ("**********") noise_point = list(noise_point) for i in range(c_n):
ct_point = list(set(center_points[i]))
plt.scatter(data[ct_point,0], data[ct_point,1], color=color[i]) # 画出不同类别的点
plt.scatter(data[noise_point,0], data[noise_point,1], color=color[c_n], marker='h', linewidths=0.1) # 画噪声点
plt.show()
DBSCAN的主要优点有:
1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
DBSCAN的主要缺点有:
1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
3) 调参相对于传统的K-Means之类的聚类算法稍复杂,不同的参数组合对最后的聚类效果有较大影响。
实验:



原图 square4 e=0.85 minpts = 13 square4-sklearn e=0.9 minpts=15

原图 结果图


原图 square1 1.185,8 square1 0.85 15

原图 结果图

原图 结果图
实验过程中:前几幅图由于分布比较密集,参数调整要很多次,后几张图因为分布比较分散,所以参数基本一次设置成功。
结果和资料已上传,下载~~~
DBSCAN密度聚类的更多相关文章
- DBSCAN密度聚类算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...
- 【转】DBSCAN密度聚类算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...
- (数据科学学习手札15)DBSCAN密度聚类法原理简介&Python与R的实现
DBSCAN算法是一种很典型的密度聚类法,它与K-means等只能对凸样本集进行聚类的算法不同,它也可以处理非凸集. 关于DBSCAN算法的原理,笔者觉得下面这篇写的甚是清楚练达,推荐大家阅读: ht ...
- 机器学习——dbscan密度聚类
完整版可关注公众号:大数据技术宅获取 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,基于密度的有噪应用中的空间聚 ...
- 密度聚类 - DBSCAN算法
参考资料:python机器学习库sklearn——DBSCAN密度聚类, Python实现DBScan import numpy as np from sklearn.cluster impo ...
- 密度聚类 DBSCAN
刘建平:DBSCAN密度聚类算法 https://www.cnblogs.com/pinard/p/6208966.html API 的说明: https://www.jianshu.com/p/b0 ...
- Python之密度聚类
# -*- coding: utf-8 -*- """ Created on Tue Sep 25 10:48:34 2018 @author: zhen "& ...
- 基于密度聚类的DBSCAN和kmeans算法比较
根据各行业特性,人们提出了多种聚类算法,简单分为:基于层次.划分.密度.图论.网格和模型的几大类. 其中,基于密度的聚类算法以DBSCAN最具有代表性. 场景 一 假设有如下图的一组数据, 生成数据 ...
- 吴裕雄 python 机器学习——密度聚类DBSCAN模型
import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...
随机推荐
- 【 Gym - 101138J 】Valentina and the Gift Tree(树链剖分)
BUPT2017 wintertraining(15) 4 D Gym - 101138J 数据 题意 n个节点的一棵树,每个节点的权值为g,q个询问,树上的节点U-V,求U到V的路径的最大子段和. ...
- python 和 scikit-learn 实现垃圾邮件过滤
文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注.目前,在机器学习模型的帮助下,包括情绪分析,文件分类,话题分类,文 ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- poj3114 Contries in War (tarjan+dijkstra)
缩完点后对每次询问做dijkstra即可 #include<cstdio> #include<cstring> #include<algorithm> #inclu ...
- luogu4849 寻找宝藏 (cdq分治+dp)
设f[i]是已经走到i号点的值. 先要给第四维离散化.然后去重 第一维排序,第二维cdq分治,第三维cdq分治,第四维树状数组,找到满足j(x,y,z,w)<=i(x,y,z,w)的j,给i统计 ...
- hdu 2845 Beans(最大不连续子序列和)
Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled ...
- vlc sdl2.0 播放示例
#include <stdio.h> #include <stdint.h> #include <math.h> #include <stdlib.h> ...
- vue使用v-if v-show页面闪烁,div闪现的解决方法
v-if和v-show可能是日常开发中最常用的两个指令,虽然看上去两者功能是类似的,但是两者还是存在很大区别的. v-if与v-show区别: 在切换 v-if 块时,Vue.js 有一个局部编译/卸 ...
- #ifndef HeaderName_h #define HeaderName_h #endif 使用详解
想必很多人都看到过头文件中写有:#ifndef HeaderName_h #define HeaderNa ...
- django中命令行调试程序
(1)进入到程序manage.py所在的目录下 (2)python manage.py shell 这样可在命令行中引入models.views.class等所有的包,然后进行命令行试运行.