DBSCAN聚类算法的Python可视化

2023-10-31

DBSCAN全称为“Density-Based Spatial Clustering of Applications with Noise”。我们可以利用sklearn在python中实现DBSCAN。

首先,import相关的Library。

import numpy as np
import pandas as pd
import math
import matplotlib.pyplot as plt
import matplotlib
from sklearn.cluster import DBSCAN
from sklearn.neighbors import NearestNeighbors

我们首先定义一个function来创建我们需要的数据集,数据集的dimension为2。下图为我们将要创建的数据集的可视化。这个数据集由三个圆圈组成。在我们定义的function中,r代表半径,n代表点的数量。

在这里插入图片描述

np.random.seed(42)
def PointsInCircum(r,n=100):
    return [(math.cos(2*math.pi/n*x)*r+np.random.normal(-30,30),math.sin(2*math.pi/n*x)*r+np.random.normal(-30,30)) for x in range(1,n+1)]

我们把创建的三个圆圈数据放在各自的dataframe里面,再制造一个noise数据集用来测试DBSCAN。

df1=pd.DataFrame(PointsInCircum(500,1000))
df2=pd.DataFrame(PointsInCircum(300,700))
df3=pd.DataFrame(PointsInCircum(100,300))
# Adding noise to the dataset
df4=pd.DataFrame([(np.random.randint(-600,600),np.random.randint(-600,600)) for i in range(300)])

将四个dataframe合并成一个dataframe,再进行可视化。

df = pd.concat([df1,df2])
df = pd.concat([df,df3])
df = pd.concat([df,df4])

plt.figure(figsize=(10,10))
plt.scatter(df[0],df[1],s=15,color='grey')
plt.title('Dataset',fontsize=20)
plt.xlabel('Feature 1',fontsize=14)
plt.ylabel('Feature 2',fontsize=14)
plt.show()

接着,我们利用从sklearn中import的DBSCAN。将dataframe输入DBSCAN,然后在原来的dataframe中添加一个column记录DBSCAN输出的labels,并以这些labels作为color map进行可视化。

dbscan=DBSCAN()
dbscan.fit(df[[0,1]])

df['DBSCAN_labels']=dbscan.labels_ 

# Plotting resulting clusters
plt.figure(figsize=(10,10))
colors=['purple','red','blue','green']
plt.scatter(df[0],df[1],c=df['DBSCAN_labels'],cmap=matplotlib.colors.ListedColormap(colors),s=15)
plt.title('DBSCAN Clustering',fontsize=20)
plt.xlabel('Feature 1',fontsize=14)
plt.ylabel('Feature 2',fontsize=14)
plt.show()

可视化的结果如下图:
在这里插入图片描述
我们看到整个图都是紫色,证明cluster的半径epsilon太小,DBSCAN把所有的点都当成noise了。我们可以利用KNN对epsilon进行优化。

neigh = NearestNeighbors(n_neighbors=2)
nbrs = neigh.fit(df[[0,1]])
distances, indices = nbrs.kneighbors(df[[0,1]])

# Plotting K-distance Graph
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.figure(figsize=(20,10))
plt.plot(distances)
plt.title('K-distance Graph',fontsize=20)
plt.xlabel('Data Points sorted by distance',fontsize=14)
plt.ylabel('Epsilon',fontsize=14)
plt.show()

在这里插入图片描述
这个图中,曲线斜率最大的位置对应epsilon等于30。重新修改DBSCAN,并把minPoints设定为6。

dbscan_opt=DBSCAN(eps=30,min_samples=6)
dbscan_opt.fit(df[[0,1]])

df['DBSCAN_opt_labels']=dbscan_opt.labels_

# Plotting the resulting clusters
plt.figure(figsize=(10,10))
plt.scatter(df[0],df[1],c=df['DBSCAN_opt_labels'],cmap=matplotlib.colors.ListedColormap(colors),s=15)
plt.title('DBSCAN Clustering',fontsize=20)
plt.xlabel('Feature 1',fontsize=14)
plt.ylabel('Feature 2',fontsize=14)
plt.show()

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DBSCAN聚类算法的Python可视化 的相关文章

随机推荐

  • C++:构造、析构、引用与拷贝构造

    构造函数 类的构造函数是类的一种特殊的成员函数 它会在每次创建类的新对象时执行 类的数据成员多为私有的 要对它们进初始化 必须用一个公有函数来进行 同时这个函数应该在且仅在定义对象时自动执行一次 这个函数就是构造函数 它由系统自动调动 用户
  • 一个sql很多个not like的简化语句 (not like 多个值的简化语句)(原创)

    我 SELECT FROM table WHERE zongbu NOT REGEXP 北京 大连 鞍山 天津 香港 沈阳 我 SELECT FROM cpu bidding where bid project name not REGEX
  • Java面试不通过?RabbitMQ你熟悉了吗?

    1 rabbitmq 的使用场景有哪些 跨系统的异步通信 所有需要异步交互的地方都可以使用消息队列 就像我们除了打电话 同步 以外 还需要发短信 发电子邮件 异步 的通讯方式 多个应用之间的耦合 由于消息是平台无关和语言无关的 而且语义上也
  • [sitemap 索引情况提示] 根据 sitemap 的规则[0],当前页面 [pages/index/index] 将被索引

    sitemap 索引情况提示 根据 sitemap 的规则 0 当前页面 pages index index 将被索引 一 报错信息 总结 一 报错信息 代码如下 示例 sitemap 索引情况提示 根据 sitemap 的规则 0 当前页
  • C++ 内存池 -- C++ Memory Pool

    本文翻译版本出自 http blog csdn net 060 archive 2006 10 08 1326025 aspx 原文作者 DanDanger2000 原文链接 http www codeproject com cpp Mem
  • 以太网学习(2)-- 网络协议简介

    目录 一 协议简介 二 协议间报文封装与拆封 三 LWIP简介 四 Lwip文件说明 4 1 如何获取LWIP源码文件 4 2 LWIP文件说明 lwip目录 src目录 core目录 4 3 查看lwip的说明文档 五 LWIP的三种编程
  • Python学习小案例-时间模块

    python学习小案例 时间模块 1 使用python打印当前的时间 方法一 方法二 2 计算两个日期之间的相差天数 比如 我们可以用这个代码计算我们出生到现在一共活了多少天 也可以计算情侣之间在一起了多少天 在这里的输入的格式位 xxxx
  • 【gradle】Android项目中gradle执行流程

    gradle文件执行流程 做过Android开发的同学都知道 Android项目中存在三个gradle文件 那你是否知道他们的执行流程呢 请看下面这张图 为了验证结论 的正确性 我们采用输出字符串的验证方式 输出结果如下 自定义gradle
  • 查询链接服务器信息,SQL Server链接服务器

    SQL Server链接服务器 SQL Server 中存在可以链接到其他服务器的选项 一般情况下是用来与别的 SQL Server 数据库相连接 但是有时候也可以与一个Microsoft Access数据库 相连接 这样的操作是通过链接服
  • 了解如何通过Python使用SQLite数据库

    SQLite is a very easy to use database engine included with Python SQLite is open source and is a great database for smal
  • 集成项目中,拿什么保证安全感?

    在一些大型集成项目中 经常要面临着将企业的十几二十几个信息化系统进行整合 数据进行共享 因为各个企业的信息化程度不同 所以项目实施起来的难易程度和工作量也大不相同 在一些项目中或多或少会出现拖期的现象 一些客户为此会经常质疑实施方的专业性
  • Seaborn系列教程(3)

    seaborn lineplot 折线图 解读 注意 数据一定是通过DataFrame中传送的 函数原型 seaborn lineplot x None y None hue None size None style None data N
  • I-D-E-A中maven的常用指令

    Maven库 http repo2 maven org maven2 Maven依赖查询 http mvnrepository com Maven常用命令 1 创建Maven的普通java项目 mvn archetype create Dg
  • centOS 7安装配置docker

    step 1 安装必要的一些系统工具 sudo yum install y yum utils device mapper persistent data lvm2 Step 2 添加软件源信息 sudo yum config manage
  • mysql 存储过程 set autocommit_SET autocommit = 1和mysql中的START TRANSACTION之间...

    了解数据库的事务 自动提交 显式和隐式 处理可以使您不必从备份还原数据 事务控制数据操作语句以确保它们是原子的 原子 意味着交易要么发生 要么不发生 向数据库发出事务完成信号的唯一方法是使用COMMIT或ROLLBACK语句 根据ANSI
  • flutter rabbitmq

    这样的rabbitmq可以实现和服务器交互 但是由于app登录人不确定 意义不大 import package dart amqp dart amqp dart dart amqp 0 2 1 Future
  • STM32CUBEMX_创建时间片轮询架构的软件框架

    STM32CUBEMX 创建时间片轮询架构的软件框架 说明 1 这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉 2 利用这种时间片的架构可以使得代码架构清晰易于维护 创建步骤 1 使用STM32CUBEMX创建基础工程 2
  • WSL2最佳实践,淘汰难用的Xshell和Finalshell

    1 安装WSL2 1 1 先决条件 确认Windows系统版本 开启虚拟化功能 1 1 1 确认Windows系统版本 必须运行 Windows 10 版本 2004 及更高版本 内部版本 19041 及更高版本 或 Windows 11
  • python的多分支结构、三目运算符、for循环、while循环、break和continue学习

    一 多分支结构 1 if单分支结构 意思是 如果xxx就xxx 语句结构 if 条件语句 代码段 2 if双分支结构 意思是 如果xxx就xxx否则xxx 语句结构 if 条件语句 代码段1 else 代码段2 3 if多分支结构 根据不同
  • DBSCAN聚类算法的Python可视化

    DBSCAN全称为 Density Based Spatial Clustering of Applications with Noise 我们可以利用sklearn在python中实现DBSCAN 首先 import相关的Library