機器學習DBSCAN密度聚類

引言

在機器學習的聚類任務中,K-means因其簡單高效廣為人知,但它有一個致命缺陷——假設簇是球形且密度均勻,且需要預先指定簇數。當數據存在任意形狀的簇、噪聲點或密度差異較大時,K-means的表現往往不盡如人意。這時候,DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 作為基于密度的聚類算法,憑借其無需預設簇數、能識別噪聲、處理任意形狀簇的特性,成為工業界和學術界的神器

本文將從原理到代碼,帶你徹底搞懂DBSCAN,并通過實戰案例掌握其核心技巧。

一、DBSCAN核心概念:用“密度”定義簇

要理解DBSCAN,首先需要明確5個核心概念:

1. ε鄰域(ε-Neighborhood)

對于數據點 ppp,其ε鄰域是指所有與 ppp 的距離不超過 ε\varepsilonε 的點的集合,數學上表示為:
Nε(p)={q∈D∣distance(p,q)≤ε}N_\varepsilon(p) = \{ q \in D \mid \text{distance}(p, q) \leq \varepsilon \}Nε?(p)={qDdistance(p,q)ε}
其中 DDD 是數據集,distance\text{distance}distance 常用歐氏距離(連續數據)或曼哈頓距離(高維稀疏數據)。

2. 核心對象(Core Object)

如果數據點 ppp 的ε鄰域內至少包含 min_samples\text{min\_samples}min_samples 個點(包括 ppp 自己),則 ppp 是一個核心對象。
換句話說,核心對象是“密度足夠高”的點,是簇形成的基礎。

3. 直接密度可達(Directly Density-Reachable)

如果點 qqq 位于核心對象 ppp 的ε鄰域內(即 q∈Nε(p)q \in N_\varepsilon(p)qNε?(p)),則稱 qqqppp 出發是直接密度可達的。

4. 密度可達(Density-Reachable)

如果存在一個點序列 p1,p2,...,pnp_1, p_2, ..., p_np1?,p2?,...,pn?,其中 p1=pp_1 = pp1?=ppn=qp_n = qpn?=q,且每個 pi+1p_{i+1}pi+1?pip_ipi? 直接密度可達,則稱 qqqppp 出發是密度可達的。
密度可達是直接密度可達的傳遞擴展,但不具備對稱性(即 qqq 密度可達 ppp 不代表 ppp 密度可達 qqq)。

5. 密度相連(Density-Connected)

如果存在一個核心對象 ooo,使得 pppqqq 都從 ooo 密度可達,則稱 pppqqq密度相連的。
密度相連的點屬于同一個簇。

6. 簇與噪聲

  • :數據集中最大的密度相連點集(即無法通過密度可達擴展更多點)。
  • 噪聲:不屬于任何簇的點(不被任何核心對象密度可達)。

二、DBSCAN算法流程:從核心對象到簇的構建

DBSCAN的核心邏輯是“從核心對象出發,擴展密度可達的點形成簇”。具體步驟如下:

  1. 計算所有點的ε鄰域:遍歷數據集,為每個點計算其ε鄰域內的點數量。
  2. 篩選核心對象:保留那些ε鄰域內點數量 ≥ min_samples的點,標記為核心對象。
  3. 擴展簇:從任意一個未被訪問的核心對象出發,遞歸地將其所有密度可達的點加入當前簇,并標記為已訪問。
  4. 處理噪聲:所有未被訪問且不屬于任何核心對象的點,標記為噪聲。

聚類原理

三、代碼實戰:用Python實現DBSCAN

1. 環境準備與數據生成

我們使用 scikit-learn 提供的合成數據,并添加噪聲。首先安裝依賴:

pip install numpy pandas matplotlib scikit-learn

生成數據代碼:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs, make_noise
from sklearn.preprocessing import StandardScaler# 生成3個真實簇(含噪聲)
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=[1.0, 2.0, 0.8],  # 不同簇的密度差異random_state=42
)
X = StandardScaler().fit_transform(X)  # 標準化數據# 添加5%的噪聲點(偏離真實簇)
noise = make_noise(n_samples=int(0.05*len(X)), noise_scale=3.0, random_state=42)[0]
X = np.concatenate([X, noise])# 可視化原始數據
plt.scatter(X[:, 0], X[:, 1], c='gray', s=10, label='Unclustered Data')
plt.title("Raw Data with Noise")
plt.legend()
plt.show()

2. 使用scikit-learn的DBSCAN

sklearn.cluster.DBSCAN 已經封裝了高效的DBSCAN實現,我們直接調用并調參:

from sklearn.cluster import DBSCAN# 初始化DBSCAN,關鍵參數:eps=ε,min_samples=min_samples
dbscan = DBSCAN(eps=0.8, min_samples=5)
clusters = dbscan.fit_predict(X)  # 輸出:-1表示噪聲,其他為簇標簽# 統計結果
n_clusters = len(set(clusters)) - (1 if -1 in clusters else 0)  # 排除噪聲標簽-1
n_noise = np.sum(clusters == -1)
print(f"Estimated number of clusters: {n_clusters}")
print(f"Estimated number of noise points: {n_noise}")# 可視化聚類結果
plt.scatter(X[:, 0], X[:, 1], c=clusters, s=10, cmap='viridis')
plt.title(f"DBSCAN Clustering (eps=0.8, min_samples=5)")
plt.colorbar(label='Cluster ID (-1=Noise)')
plt.show()

3. 關鍵參數調優:如何選擇ε和min_samples?

DBSCAN的效果高度依賴兩個參數:

  • eps(ε):鄰域半徑,太小會導致很多簇被分割,太大可能合并不同簇。
  • min_samples:核心對象的最小鄰域點數,通常設置為維度+1(如2維數據設為3-5)。

調參技巧:k-distance圖
k-distance圖通過計算每個點到其第k近鄰的距離并排序,繪制折線圖。曲線的“拐點”對應的距離即為合適的ε(通常k=min_samples-1)。

from sklearn.neighbors import NearestNeighbors
import numpy as np# 計算每個點的k近鄰距離(k=min_samples-1=4)
min_samples = 5
k = min_samples - 1
neighbors = NearestNeighbors(n_neighbors=k)
neighbors_fit = neighbors.fit(X)
distances, indices = neighbors_fit.kneighbors(X)# 排序距離并繪制
distances = np.sort(distances, axis=0)[:, 1]  # 取第k近鄰的距離(排除自己)
plt.plot(distances)
plt.xlabel("Points sorted by distance")
plt.ylabel(f"{k}-th Nearest Neighbor Distance")
plt.title("k-distance Plot for ε Selection")
plt.grid(True)
plt.show()

解讀k-distance圖
曲線從左下到右上逐漸上升,當出現一個明顯的“跳躍”(拐點)時,對應的距離即為合適的ε。例如,若拐點在距離0.8處,則設置eps=0.8

四、DBSCAN的優缺點與適用場景

優點:

  • 無需預設簇數:自動根據數據密度劃分簇。
  • 抗噪聲能力強:明確識別噪聲點(標簽-1)。
  • 處理任意形狀簇:不依賴簇的球形假設。

缺點:

  • 參數敏感:ε和min_samples的選擇對結果影響大。
  • 高維數據效果下降:高維空間中距離度量失效(維度詛咒)。
  • 密度不均勻時表現差:若簇間密度差異大,難以找到統一的ε。

適用場景:

  • 數據分布有明顯密度差異(如用戶分群中的高價值/低活躍用戶)。
  • 存在噪聲或離群點(如金融欺詐檢測)。
  • 簇形狀不規則(如地理區域的用戶分布)。

五、總結

DBSCAN是一種強大的密度聚類算法,核心是通過“核心對象”和“密度可達”定義簇,天然抗噪聲且能處理任意形狀的簇。實戰中需重點調參ε和min_samples,推薦使用k-distance圖輔助選擇ε。下次遇到傳統聚類算法無法解決的復雜數據時,不妨試試DBSCAN

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94975.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RecyclerView 緩存機制

一、四級緩存體系1. Scrap 緩存(臨時緩存)位置:mAttachedScrap 和 mChangedScrap作用:存儲當前屏幕可見但被標記為移除的 ViewHolder用于局部刷新(如 notifyItemChanged())特點:生命周期短&…

大模型SSE流式輸出技術

文章目錄背景:為什么需要流式輸出SSE 流式輸出很多廠商還是小 chunk背景:為什么需要流式輸出 大模型的響應通常很長,比如幾百甚至幾千個 token,如果等模型一次性生成完才返回: 延遲高:用戶要等很久才能看…

[Flutter] v3.24 AAPT:錯誤:未找到資源 android:attr/lStar。

推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰 前提 將 Flutter 升級到 3.24.4 后,構建在我的本地電腦上通過,但Github actions 構建時失敗。 Flutt…

go語言標準庫學習, fmt標準輸出,Time 時間,Flag,Log日志,Strconv

向外輸出 fmt包實現了類似C語言printf和scanf的格式化I/O。主要分為向外輸出內容和獲取輸入內容兩大部分。 內置輸出 不需要引入標準庫,方便 package mainfunc main() {print("我是控制臺打印,我不換行 可以自己控制換行 \n我是另一行")prin…

ElementUI之表格

文章目錄使用ElementUI使用在線引入的方式表格1. 帶狀態表格row-class-name"Function({row, rowIndex})/String"2. 固定表頭(height"string/number"屬性)2.1 屬性的取值2.2 動態響應式高度使用演示2.3 ??自定義滾動條樣式??2.4 表頭高度定制獲取一行信…

K8S 的 Master組件

K8S 的 Master 組件有哪些?每個組件的作用? K8s 大腦的 4 大核心模塊,掌控全局! Kubernetes 集群的 Master(主節點) 就像一座 指揮中心,負責整個集群的調度、管理和控制。它由 4 大核心組件組成…

如何 讓ubuntu 在root 下安裝的docker 在 普通用戶下也能用

在 Ubuntu 系統中,如果 Docker 是以 root 用戶安裝的,普通用戶默認無法直接使用 Docker 命令(會報權限錯誤)。要讓普通用戶也能使用 Docker,可以按照以下步驟操作:方法 1:將用戶加入 docker 用戶…

模板方法模式:優雅封裝算法骨架

目錄 一、模板方法模式 1、結構 2、特性 3、優缺點 3.1、優點 3.2、缺點 4、使用場景 5、實現示例 5.1、抽象類 5.2、實現類 5.3、測試類 一、模板方法模式 模板方法模式(Template Method Pattern)是一種行為設計模式,它在一個方…

韋東山STM32_HAl庫入門教程(SPI)學習筆記[09]內容

(1)SPI程序層次一、核心邏輯:“SPI Flash 操作” 是怎么跑起來的?要讀寫 SPI Flash,需同時理解 硬件連接(怎么接線) 和 軟件分層(誰負責發指令、誰負責控制邏輯)&#xf…

線上Linux服務器的優化設置、系統安全與網絡安全策略

一、Linux服務器的優化設置 線上Linux的優化配置序號基礎優化配置內容說明1最小化安裝系統【僅安裝需要的,按需安裝、不用不裝】,必須安裝的有基本開發環境、基本網絡包、基本應用包。2ssh登錄策略優化 Linux服務器上的ssh服務端配置文件是【/et…

基于人眼視覺特性的相關圖像增強基礎知識介紹

目錄 1. 傳統的灰度級動態范圍優化配置方法 2.基于視覺特性的灰度級動態范圍調整優化 1. 傳統的灰度級動態范圍優化配置方法 傳統的灰度級動態范圍調整方法主要包括線性動態范圍調整及非線性動態 范圍調整。線性動態范圍調整是最簡單的灰度級動態范圍調整方法,觀察…

Selenium使用超全指南

🍅 點擊文末小卡片 ,免費獲取軟件測試全套資料,資料在手,漲薪更快概述selenium是網頁應用中最流行的自動化測試工具,可以用來做自動化測試或者瀏覽器爬蟲等。官網地址為:相對于另外一款web自動化測試工具QT…

Go通道操作全解析:從基礎到高并發模式

一、channel類型 Go 語言中的通道(channel)是一種特殊的類型。它類似于傳送帶或隊列,遵循先進先出(FIFO)原則,確保數據收發順序的一致性。每個通道都是特定類型的導管,因此在聲明時必須指定其元素類型。 channel是一種類型, 一種引用類型。 聲明通道類型的格式如下:…

Linux網絡--1、網絡基礎

目錄 一、網絡發展 二、理解分層 2.1OSI七層模型 2.2TCP/IP分層模型 2.3分層的好處 三、認識協議 3.1初步認識 3.2了解指定組織 3.3具體協議理解 3.3.1是什么 3.3.2為什么 3.3.3與OS的關系 3.4總結 四、網絡傳輸流程 4.1局域網網絡傳輸 4.1.1通信過程 4.1.2概念解析 4.2跨網…

前端視角下關于 WebSocket 的簡單理解

參考 RFC 6455: The WebSocket Protocol WebSocket 協議基礎 協議本質:在單個 TCP 連接上提供全雙工通信通道的協議核心優勢: 雙向實時通信(服務器主動推送)低延遲(相比 HTTP 輪詢)高效數據傳輸&#xff0…

自動化一鍵部署 LNMP 環境

第一步:準備環境 & 準備腳本文件1. 你在 CentOS 7 的服務器/虛擬機里打開終端,確認你有 root 權限或者能用 sudo。輸入下面命令確認你的系統版本:cat /etc/centos-release你應該看到類似:CentOS Linux release 7.9.2009 (Core…

react之React.cloneElement()

react提供的這個方法克隆組件的方法,可能我們在平常的開發中用的很少,主要可能是我們并不知道或者并不了解這個方法。因為我在之前react的children文章中用到過,所以我就進行了一系列的測試,發現真的非常的好用。我們同樣使用一些…

學習Java的Day27

今天學習的主要內容是在IntelliJ IDEA開發環境中,通過部署Tomcat服務器并連接MySQL數據庫,實現了一個完整的留言板系統。這個項目涵蓋了前后端開發的全流程,具體包括以下關鍵環節:開發環境搭建使用IntelliJ IDEA Ultimate版&#…

【計算機網絡 | 第3篇】物理媒介

文章目錄物理媒介介紹與物理媒體的分類🥝成本考量引導型傳輸媒體🍋引導型傳輸媒體:雙絞線🍋?🟩雙絞線類別雙絞線的發展歷程雙絞線的物理限制引導型傳輸媒體:同軸電纜🍋?🟩結構組成…

golang的切片

切片 為什么需要切片 用于元素的個數不確定,所以無法通過數組的形式來進行統計。此時就需要切片 切片,也因此可以粗略地理解為動態數組數組的長度不能用變量來確定,這時候切片slice也就派上用場了 切片地基本介紹 切片的英文是slice切片是數組…