【聚类算法】DBSCAN基于密度聚类

news/2024/11/22 15:45:49/

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

瞬间感觉kmeans不香了,哈哈哈
在这里插入图片描述

1. 正文

1.1 概念

DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 基于密度的空间聚类。根据密度将数据划分成簇,可以在有噪声的空间中发现任意形状的簇。

1.1.1 形象化理解

现在有一群人,要在他们中发展微商。一个人只有发展直系亲属,且人数大于5个,微商才算做成功。通过这个规则,很容易在人群中划分出不同的“微商群”,即实现了聚类。(是不是很简短,有木有~)

1.2.2 一般概念

(1). 三种点

  • 核心点
  • 边界点
  • 噪声点

如下图,一个点,如果在指定的半径内(上面所说的直系亲属,确定远近关系的)存在一定数量的其他点(上面的大于5,用于确定密度),则称该点为 核心点

继续用半径数量发展“下线”,直到最后无法满足规则未知,最后的“下线”成为边界点,不在左右簇中的点为噪声点
在这里插入图片描述

(2). 四种关系

  1. 如果P是核心点,Q在P的邻域内,则称P到Q密度直达
    • 核心点到自身密度直达
    • 密度直达不对称。(P到Q密度直达,Q到P不一定密度直达,注意: 上面微商的例子在这里不对,可以看数据点之间距离,应该比较好理解)
  2. 如果核心点P1到P2密度直达,P2到P3密度直达,…,Pn到Q密度直达 ,则,P1到Q密度可达 (密度可达同样无对称性,由密度直达不具有对称性,应该比较好理解)
  3. 如果存在核心带S,使S到P和Q都密度可达,则P和Q密度相连,密度相连具有对称性,密度相连的两个点在同一个聚类簇。
  4. 如果两个点不属于密度相连关系,则两个点非密度相连,非密度相连的两个点属于不同的聚类簇,或者其中存在噪声。

可以看下图理解:
在这里插入图片描述

1.2 算法步骤

  1. 遍历所有样本点,如果指定半径内样本数大于指定的值,则当前样本纳入核心点列表,并将其密度直达的点形成临时聚类簇
  2. 对于每个临时聚类簇,检查其中的点是否为核心点,如果是,将当前点形成的聚类簇和当前点自身的临时聚类簇合并,得到新的临时聚类簇。(发展下线过程)
  3. 重复此过程,直到当前临时聚类簇中的每个点要么不在核心点列表中,要么其密度直达点都已经在该临时聚类簇。该临时聚类簇升级为聚类簇。
  4. 继续对剩余的临时聚类簇进行此过程。直到所有临时聚类簇被处理。

在这里插入图片描述

1.3 demo

说明:jupyter notebook里面运行

生成样本点

%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import numpy as np
import pandas as pd
from sklearn import datasetsX,_ = datasets.make_moons(500,noise = 0.1,random_state=1)
df = pd.DataFrame(X,columns = ['feature1','feature2'])df.plot.scatter('feature1','feature2', s = 100,alpha = 0.6, title = 'dataset by make_moon');

在这里插入图片描述
聚类

%matplotlib inline
%config InlineBackend.figure_format = 'svg'from sklearn.cluster import dbscan# eps为邻域半径,min_samples为最少点数目
core_samples,cluster_ids = dbscan(X, eps = 0.2, min_samples=20) 
# cluster_ids中-1表示对应的点为噪声点df = pd.DataFrame(np.c_[X,cluster_ids],columns = ['feature1','feature2','cluster_id'])
df['cluster_id'] = df['cluster_id'].astype('i2')df.plot.scatter('feature1','feature2', s = 100,c = list(df['cluster_id']),cmap = 'rainbow',colorbar = False,alpha = 0.6,title = 'sklearn DBSCAN cluster result');

在这里插入图片描述

1.4 eps值的设定

1.4.1 方法一:OPTICS算法

from sklearn.cluster import OPTICS
from sklearn.datasets import make_blobs# 生成随机数据
X, y = make_blobs(n_samples=1000, centers=3, random_state=42)# 使用 OPTICS 算法自适应估计 eps 值
optics = OPTICS(min_samples=10, xi=0.05)
optics.fit(X)# 输出聚类结果和估计的 eps 值
print("Estimated eps:", optics.eps_)
print("Cluster labels:", optics.labels_)

1.4.3 方法二:K-距离

from sklearn.neighbors import NearestNeighbors
from sklearn.datasets import make_blobs# 生成随机数据
X, y = make_blobs(n_samples=1000, centers=3, random_state=42)# 计算 k-距离
knn = NearestNeighbors(n_neighbors=10)
knn.fit(X)
distances, indices = knn.kneighbors(X)# 估计 eps 值
eps = distances[:, 9].mean()# 输出估计的 eps 值
print("Estimated eps:", eps)

1.5 动画理解

推荐一个动画网站:
https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/

在这里插入图片描述

参考

[1] https://blog.csdn.net/swy_swy_swy/article/details/106130675
[2] https://blog.csdn.net/Cyrus_May/article/details/113504879
[3] https://blog.csdn.net/huacha__/article/details/81094891#t0
[4] https://zhuanlan.zhihu.com/p/336501183
[5] https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/


http://www.ppmy.cn/news/618774.html

相关文章

从数值、玩法、社交模块入手谈MMORPG手游设计

剑灵手游在韩服首发已有一年半,上个月登录台服,稍稍体验了一下。本文接下来将轻度漫谈一下——韩国与国内MMO手游设计,包含的范围主要为数值->玩法->社交三点。我们先对三个模块进行简单的定义:、 数值是基础&#xff1a…

游戏开发学习指导

转自:http://www.zhihujingxuan.com/18625.html 本人大约从20多年前开始学习及使用C,但仍未达到我认为「精通」的阶段,甚至对于C11的各种新特性也未掌握。然而因为我是在读书时自学C的,也是游戏程序员(原问题中提到题主…

SpringBoot2 + Vue2 项目实战(一)集成ElementUI及整体框架搭建

一、创建项目集成element-ui 软件版本 jdk 1.8mysql5.7node14.16.0navicatidea2021.3 下载地址:毕设软件 - 坚果云 - 云盘|网盘|企业网盘|同步|备份|无限空间|免费网络硬盘|企业云盘 vue-cli安装:npm install -g vue/cli npm设置淘宝镜像加速&#…

OpenCV——《直方图操作》和《模版匹配》

1.直方图均衡化 img cv2.imread(clahe.jpg,0) plt.hist(img.ravel(),256) plt.show() #旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。 equ cv2.equalizeHist(img) plt.hist(equ.ravel(),256) plt.show() #进行对比,均值化之后…

测试passport

测试了卡带机发卡机伏拉夫就撒理解 密码 密码 passport测试了卡带机发卡机伏拉夫就撒理解passport测试了卡带机发卡机伏拉夫就撒理解passport测试了卡带机发卡机伏拉夫就撒理解passport测试了卡带机发卡机伏拉夫就撒理解passport测试了卡带机发卡机伏拉夫就撒理解passport测…

关于爬取京东商品界面出现的passport

MOOC关于爬取京东商品界面的实例: import requests url "https://item.jd.com/100002795959.html" try:r requests.get(url)r.raise_for_status()r.encoding r.apparent_encodingprint(r.text[:1000]) except:print("爬取失败")运行后出现 …

passport.js学习笔记

passport概述 passport.js是Nodejs中的一个做登录验证的中间件,极其灵活和模块化,并且可与Express、Sails等Web框架无缝集成。Passport功能单一,即只能做登录验证,但非常强大,支持本地账号验证和第三方账号登录验证&a…

passport身份验证

创建文件authoriry.js module.exports {/*** 登陆权限验证*/isAuthenticated: function (req, res, next) {if(req.isAuthenticated()) {console.log(权限验证通过)return next();//继续访问}else{console.log(请先登陆)res.redirect(/bookshelf/login)//页面跳转}} };创建文…