西瓜书学习笔记——密度聚类(公式推导+举例应用)

文章目录

      • 算法介绍
      • 实验分析

算法介绍

密度聚类是一种无监督学习的聚类方法,其目标是根据数据点的密度分布将它们分组成不同的簇。与传统的基于距离的聚类方法(如K均值)不同,密度聚类方法不需要预先指定簇的数量,而是通过发现数据点周围的密度高度来确定簇的形状和大小。我们基于DBSCAN算法来实现密度聚类。

DBSCAN是基于一组邻域参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)来刻画样本分布的紧密程度,给定数据集 D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm}定义以下几个概念:

  • ϵ \epsilon ϵ-邻域:对 x j ∈ D x_j\in D xjD,其 ϵ \epsilon ϵ-邻域包含样本集 D D D中不大于 ϵ \epsilon ϵ的样本点,即 N ϵ ( x j ) = { x i ∈ D ∣ dist ⁡ ( x i , x j ) ⩽ ϵ } N_\epsilon\left(\boldsymbol{x}_j\right)=\left\{\boldsymbol{x}_i \in D \mid \operatorname{dist}\left(\boldsymbol{x}_i, \boldsymbol{x}_j\right) \leqslant \epsilon\right\} Nϵ(xj)={xiDdist(xi,xj)ϵ}
  • 核心对象:若 x j x_j xj ϵ \epsilon ϵ-邻域至少包含了 M i n P t s MinPts MinPts个样本,即 ∣ N ϵ ( x j ) ∣ ⩾ M i n P t s \left|N_\epsilon\left(\boldsymbol{x}_j\right)\right| \geqslant MinPts Nϵ(xj)MinPts,则 x j x_j xj是一个核心对象。
  • 密度直达:若 x j x_j xj位于 x i x_i xi ϵ \epsilon ϵ-邻域中,且 x i x_i xi是核心对象,则称 x j x_j xj x i x_i xi密度直达。
  • 密度可达:对 x i x_i xi x j x_j xj,若存在样本序列 p 1 , p 2 , . . . , p n p_1,p_2,...,p_n p1,p2,...,pn,其中 p 1 = x i p_1=x_i p1=xi p n = x j p_n=x_j pn=xj p i + 1 p_{i+1} pi+1 p i p_i pi密度直达,则称 x j x_j xj x i x_i xi密度可达。
  • 密度相连:对 x i x_i xi x j x_j xj,若存在 x k x_k xk使得 x i x_i xi x j x_j xj均由 x k x_k xk密度可达,则称 x i x_i xi x j x_j xj密度相连。
    在这里插入图片描述
    DBSCAN算法将定义为:由密度可达关系导出的最大密度相连的集合。于是,DBSCAN算法先任选数据集中的一个核心对象为种子,由此出发确定相应的聚类簇,其算法流程图如下所示:

在这里插入图片描述

实验分析

数据集如下表所示:
在这里插入图片描述
读入数据集:

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata = pd.read_csv('data/4.0.csv')

定义距离函数:

# 定义距离函数
def distance(point1, point2):return np.linalg.norm(point1 - point2)

ϵ \epsilon ϵ-邻域函数:

# 定义 epsilon-邻域 函数
def epsilon_neighborhood(point, epsilon, data):neighbors = []for i, other_point in enumerate(data):if distance(point, other_point) <= epsilon:neighbors.append(i)return neighbors

定义核心对象判定函数:

# 定义核心对象判定函数
def is_core_object(point, epsilon, min_pts, data):neighbors = epsilon_neighborhood(point, epsilon, data)return len(neighbors) >= min_pts

定义 DBSCAN 算法:

def dbscan(data, epsilon, min_pts):labels = [0] * len(data)cluster_id = 0for i, point in enumerate(data):if labels[i] != 0:continueneighbors = epsilon_neighborhood(point, epsilon, data)if len(neighbors) < min_pts:labels[i] = -1  # 标记为噪声点continuecluster_id += 1labels[i] = cluster_idfor neighbor in neighbors:if labels[neighbor] == -1:labels[neighbor] = cluster_idif labels[neighbor] != 0:continuelabels[neighbor] = cluster_idother_neighbors = epsilon_neighborhood(data[neighbor], epsilon, data)if len(other_neighbors) >= min_pts:neighbors.extend(other_neighbors)return labels

设置超参数:

# 设置 epsilon 和 min_pts 参数
epsilon_value = 0.1
min_pts_value = 4

执行DBSCAN算法并绘制结果:

# 执行 DBSCAN 算法
result_labels = dbscan(data.to_numpy(), epsilon_value, min_pts_value)# 获取唯一的聚类标签
unique_labels = np.unique(result_labels)# 绘制结果
plt.figure(figsize=(8, 8))
for label in unique_labels:if label == -1:plt.scatter(data['Density'][result_labels == label], data['Sugar inclusion rate'][result_labels == label], c='gray', marker='o', edgecolors='black', s=70, label='Noise')else:plt.scatter(data['Density'][result_labels == label], data['Sugar inclusion rate'][result_labels == label], label=f'Cluster {label}', marker='o', edgecolors='black', s=70)plt.title('DBSCAN Clustering Result')
plt.xlabel('Density')
plt.ylabel('Sugar inclusion rate')
plt.legend()
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439420.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024)

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024) 2024 International Conference Big Data Economy and Social Culture 一、【会议简介】 随着大数据技术的飞速发展&#xff0c;全球范围内对大数据经济与社会文化的研究愈发深入。为了促进国际间学术交流…

【学网攻】 第(15)节 -- 标准ACL访问控制列表

系列文章目录 目录 系列文章目录 文章目录 前言 一、ACL(访问控制列表)是什么? 二、实验 1.引入 实验拓扑图 实验配置 测试PC2能否Ping通PC3 配置ACL访问控制 实验验证 PC1 Ping PC3 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认…

java OA办公自动化系统

java OA办公自动化系统&#xff0c;java项目&#xff0c;springboot项目。eclipse和idea都能打开运行。 前端技术&#xff1a;Bootstrap&#xff0c;Jquery&#xff0c;My97 DatePicker&#xff0c;kindeditor&#xff0c;freemarker 后端技术&#xff1a;SpringBoot&#xf…

MacOS安装反编译工具JD-GUI以及解决无法打开的问题

目录 一.下载地址 二.安装 三.问题 四.解决办法 1.显示包内容 2.找到Contents/MacOS/universalJavaApplicationStub.sh 3.修改sh文件 4.保存后再次打开即可 一.下载地址 Java Decompiler 二.安装 将下载下来的 jd-gui-osx-1.6.6.tar 解压&#xff0c;然后将 JD-GUI.a…

网站小程序分类目录网源码系统+会员注册登录功能 附带完整的搭建教程

随着互联网的发展&#xff0c;小程序分类目录网站已经成为了人们获取各类信息的重要渠道。而在这个领域中&#xff0c;罗峰给大家分享一款网站小程序分类目录网源码系统以其强大的功能和易用性&#xff0c;脱颖而出。本系统集成了会员注册登录功能&#xff0c;让用户能够更加便…

最新国内GPT4.0使用入门到精通,Midjourney绘画,GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

【C/C++ 02】希尔排序

希尔排序虽然是直接插入排序的升级版本&#xff0c;和插入排序有着相同的特性&#xff0c;即原始数组有序度越高则算法的时间复杂度越低&#xff08;预排序机制&#xff09;&#xff0c;但是是不稳定排序算法。 为了降低算法的时间复杂度&#xff0c;所以我们需要在排序之前尽…

《HTML 简易速速上手小册》第9章:HTML5 新特性(2024 最新版)

文章目录 9.1 HTML5 新增标签和属性9.1.1 基础知识9.1.2 案例 1&#xff1a;创建一个结构化的博客页面9.1.3 案例 2&#xff1a;使用新的表单元素创建事件注册表单9.1.4 案例 3&#xff1a;创建一个具有高级搜索功能的搜索表单 9.2 HTML5 表单增强9.2.1 基础知识9.2.2 案例 1&a…

Windows Server 2025 LTSC 预览版来了

Windows Server 2025 LTSC 预览版来了 1. 安装 Windows Server 2025 LTSC 预览版2. 安装 VMware Tools3. Windows Server 2025 LTSC 预览版4. Windows Server 2025 LTSC 预览版下载地址 1. 安装 Windows Server 2025 LTSC 预览版 使用 VMware Workstation 安装&#xff0c; 安…

测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)

EasyCaching属于开源缓存库&#xff0c;支持基本缓存方式及高级缓存用法&#xff0c;提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型&#xff0c;本文学习最基础的InMemory方式的基本用法。   EasyCaching.InMemory包属于基于内存的缓存库&#xff0c;使用的…

QWidget

目录 setWindowTitle 改变主体窗口大小 setWindowTitle 代码&#xff1a; ui->setupUi(this);setWindowTitle("CSDN"); 这样写可以&#xff0c;但是下面的写在ui指针前面的写法就不行&#xff0c;达不到效果&#xff1a; 改变主体窗口大小 代码&#xff1a; …

运行VUE提示找不到模块validate-engines.js...

原来好好的&#xff0c;突然提示找不到模块validate-engines.js&#xff0c;CMD命令行输入npm -v不是内部或外部命令&#xff0c;node -v可以查看到版本号。 解决&#xff1a; 1. 卸载nodejs&#xff0c;重新下载安装文件&#xff1a;下载nodejs 2. 到目录&#xff1a;C:\Us…