基于密度的聚类算法:DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。
好处
缺点
# coding=utf-8from numpy import *
import matplotlib.pyplot as pltfrom matplotlib.pyplot import *
from collections import defaultdict
import randomclass DbScan(object):def show(self,data,color=None):if not color:color='green'group=self.createDataSet()fig = plt.figure(1)axes = fig.add_subplot(111)axes.scatter(group[:, 0], group[:, 1], s=40, c='red')axes.scatter(data[:, 0], data[:, 1], s=50, c=color)plt.show()def createDataSet(self):group = [[1.0, 1.1], [1.0, 1.0],[0, 0], [0, 0.1],[2, 1.0], [2.1, 0.9],[0.3, 0.0], [1.1, 0.9],[2.2, 1.0], [2.1, 0.8],[3.3, 3.5], [2.1, 0.9],[2, 1.0], [2.1, 0.9],[3.5, 3.4], [3.6, 3.5]]return groupdef dist(self,p1, p2):return ((p1[0]-p2[0])**2+ (p1[1]-p2[1])**2)**(0.5)def db_scan(self):all_points = self.createDataSet()E = 0.3minPts = 2# find out the core pointsother_points = []core_points = [] # 核心点集合plotted_points = [] # 使用到的点 非噪声点for point in all_points:point.append(0) # 在点的后面加上第三维度类别,初始类别为 0total = 0for otherPoint in all_points:distance = self.dist(otherPoint, point) # 遍历其他点并计算距离if distance <= E:total += 1 # 计算当前点的e领域内点的个数if total > minPts:core_points.append(point) # 是核心点,添加到列表coreplotted_points.append(point) # 将核心点添加到列表 plottedelse:other_points.append(point) # 不是核心点,添加到其他点# find border pointsborder_points = []for core in core_points: # 遍历核心点for other in other_points: # 遍历非核心点if self.dist(core, other) <= E:border_points.append(other) # 添加到非噪声点集合plotted_points.append(other) # 添加到非噪声点集合# implement the algorithmcluster_label = 0for point in core_points: # 遍历核心点if point[2] == 0: # 核心点所属类别为0cluster_label += 1point[2] = cluster_label # 每遍历一个核心点,类别栏就加1for point2 in plotted_points: # 遍历非噪声点distance = self.dist(point2, point)if point2[2] == 0 and distance <= E: # 非噪声点的类别为0 并且与核心点的距离小于epoint2[2] = point[2] # 将核心点的类别赋值给非噪声点# print point, point2# after the points are asssigned correnponding labels, we group themcluster_list = defaultdict(lambda: [[], []]) # 定义一个字典,默认值是包含两个列表的列表for point in plotted_points:cluster_list[point[2]][0].append(point[0]) # 类别为键,值得第一个列表是非噪声点的xcluster_list[point[2]][1].append(point[1]) # 类别为键,值得第一个列表是非噪声点的ymarkers = ['+', '*', '.', 'd', '^', 'v', '>', '<', 'p']## plotting the clustersi = 0print cluster_listfor value in cluster_list:cluster = cluster_list[value]plot(cluster[0], cluster[1], markers[i])i = i % 10 + 1# plot the noise points as wellnoise_points = []for point in all_points:if not point in core_points and not point in border_points:noise_points.append(point)noisex = []noisey = []for point in noise_points:noisex.append(point[0])noisey.append(point[1])plot(noisex, noisey, "x")# /## title(str(len(cluster_list)) + " clusters created with E =" + str(E) + " Min Points=" + str(# minPts) + " total points=" + str(len(all_points)) + " noise Points = " + str(len(noise_points)))axis((-1, 5, -1, 5))show()def start(self):self.db_scan()p=DbScan()
p.start()
dbscan 在2维上效果要优于kmeans,不过各有利弊,一个是靠数据密度做输入,一个是靠分类类别做输入
转载于:https://www.cnblogs.com/greadlovejm/p/6090163.html
基于密度的聚类算法:DBSCAN相关推荐
- 机器学习-无监督学习-聚类:聚类方法(二)--- 基于密度的聚类算法【DBSCAN文本聚类算法,密度最大值文本聚类算法】
密度聚类方法的指导思想是,只要样本点的密度大于某阀值,则将该样本添加到最近的簇中. 基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一 ...
- 基于密度的聚类算法(1)——DBSCAN详解
基于密度的聚类算法(1)--DBSCAN详解 基于密度的聚类算法(2)--OPTICS详解 基于密度的聚类算法(3)--DPC详解 1. DBSCAN简介 DBSCAN(Density-Based S ...
- 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( K-Means 方法缺陷 | 基于密度聚类原理及概念 | ε-邻域 | 核心对象 | 直接密度可达 | 密度可达 | 密度连接 )
文章目录 I . K-Means 算法在实际应用中的缺陷 II . K-Means 初始中心点选择不恰当 III . K-Means 优点 与 弊端 IV . 基于密度的聚类方法 V . 基于密度的聚 ...
- 基于密度的聚类算法(3)——DPC详解
基于密度的聚类算法(1)--DBSCAN详解 基于密度的聚类算法(2)--OPTICS详解 基于密度的聚类算法(3)--DPC详解 1. DPC简介 2014年,一种新的基于密度的聚类算法被提出,且其 ...
- 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( DBSCAN 原理 | DBSCAN 流程 | 可变密度问题 | 链条现象 | OPTICS 算法引入 | 聚类层次 | 族序概念 )
文章目录 I . DBSCAN 简介 II . DBSCAN 算法流程 III . DBSCAN 算法 优缺点 IV . 可变密度问题 V . 链条现象 VI . OPTICS 算法原理 VII . ...
- matlab编程实现基于密度的聚类(DBSCAN)
1. DBSCAN聚类的基本原理 详细原理可以参考链接: https://www.cnblogs.com/pinard/p/6208966.html 这是找到的相对很详细的介绍了,此链接基本仍是周志华 ...
- 聚类(中)层次聚类 基于密度的聚类算法
简单用k-mean处理iris 数据集 import pandas as pd from sklearn.cluster import KMeans from sklearn.metrics impo ...
- DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式
文章目录 @[toc] 一.DBSCAN聚类概述 1.伪代码 2.优点: 3.缺点: 4.与其他聚类算法比较 二.sklearn中的DBSCAN聚类算法 1.主要函数介绍: 最重要的两个参数: 其他主 ...
- 【数据挖掘】聚类算法 简介 ( 基于划分的聚类方法 | 基于层次的聚类方法 | 基于密度的聚类方法 | 基于方格的聚类方法 | 基于模型的聚类方法 )
文章目录 I . 聚类主要算法 II . 基于划分的聚类方法 III . 基于层次的聚类方法 IV . 聚合层次聚类 图示 V . 划分层次聚类 图示 VI . 基于层次的聚类方法 切割点选取 VII ...
最新文章
- 【剑道之道】亦是生存之道
- 口腔取模过程及注意事项_数字化口 腔的发展与展望
- vacantcell缓存分析
- Xshell 连接本地的Linux 系统,提示:Could not connect to '192.168.182.128' (port 23): Connection failed
- 1777:文件结构“图”
- c#问题(按F1或F2键时触发事件)
- php.exe占用资源过大,记录一次php占用系统资源过高的问题
- Java中找出s字符串的回文_给定一个字符串 s,找到 s 中最长的回文子串。
- 拓端tecdat|Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW
- matlab描点写函数,matlab描点并标上点的序号
- 使用miniSipServer为中小企业搭建VOIP服务器
- 佛说爱情二:前生500次的回眸才换得今生的一次擦肩而过
- Go 1.19 发行说明(翻译)
- 计算机属性高级是灰色的,Win10文件夹属性隐藏选项为灰色不可勾选怎么办?
- 计算机更名无法登陆用友u8,用友T6软件修改了计算机名称后,系统管理提示不能连接服务器-用友T6...
- Django 之ORM(一)
- 【关系网络】Learning to Compare: Relation Network for Few-Shot Learning
- php交易商城项目源代码,PHP源码交易商城网站整站源码(商业运行版)
- android adb没反应,Android adb无法发现设备处理方法
- 利用python脚本自动发布服务之arcmap篇