機械學習--DBSCAN 算法(附實戰案例)

DBSCAN 算法詳解

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,帶噪聲的基于密度的空間聚類應用)是一種經典的密度聚類算法,由 Martin Ester 等人于 1996 年提出。與 K-means 等基于距離的聚類算法不同,DBSCAN 通過數據點的局部密度來劃分簇,能夠發現任意形狀的簇并自動識別噪聲點,在空間數據挖掘、異常檢測等領域有廣泛應用。

一、核心思想

DBSCAN 的核心思想是:“簇是由足夠密集的點組成的連續區域,而簇之外的點被視為噪聲”。具體來說:

  • 若一個區域內的點密度高于某個閾值,則該區域被劃分為一個簇;
  • 密度低于閾值的點被標記為噪聲(異常點);
  • 無需預先指定簇的數量,簇的數量由數據本身的密度分布自動決定。

二、關鍵概念

理解 DBSCAN 需先掌握以下核心概念,這些概念是算法聚類邏輯的基礎:

1. 核心參數

  • ε(Epsilon,半徑):定義 “鄰域” 的范圍,即一個點的 ε 鄰域是指以該點為中心、半徑為 ε 的區域(在歐氏空間中為球體,高維空間中為超球體)。
  • MinPts(最小點數):定義 “密集區域” 的閾值,即一個點的 ε 鄰域內至少包含 MinPts 個點(包括該點自身),才能認為該區域是密集的。

2. 點的類型

基于 ε 和 MinPts,數據集中的點可分為三類:

  • 核心點(Core Point):若一個點的 ε 鄰域內包含至少 MinPts 個點(包括自身),則該點為核心點。核心點是簇的 “種子”,代表密集區域的中心。
    例:若 ε=2,MinPts=5,點 p 的 ε 鄰域內有 6 個點(含 p),則 p 是核心點。

  • 邊界點(Border Point):若一個點的 ε 鄰域內包含的點數小于 MinPts,但該點落在某個核心點的 ε 鄰域內,則該點為邊界點。邊界點屬于某個簇,但自身不構成密集區域。
    例:點 q 的 ε 鄰域內有 3 個點(<MinPts=5),但 q 在核心點 p 的 ε 鄰域內,則 q 是邊界點,屬于 p 所在的簇。

  • 噪聲點(Noise Point):既不是核心點,也不在任何核心點的 ε 鄰域內的點,被視為噪聲(異常點)。
    例:點 r 的 ε 鄰域內只有 2 個點(<MinPts=5),且沒有任何核心點的 ε 鄰域包含 r,則 r 是噪聲點。

3. 密度關系

DBSCAN 通過 “密度可達” 和 “密度相連” 定義簇的結構:

  • 密度可達(Density-Reachable):若存在一條點鏈?p1?,p2?,...,pk?,其中?p1?=p,pk?=q,且每個?pi??都是核心點,且?pi+1??在?pi??的 ε 鄰域內,則稱 q 從 p 密度可達。
  • 密度相連(Density-Connected):若存在一個核心點 o,使得 p 和 q 都從 o 密度可達,則稱 p 和 q 密度相連。

簇的定義:由所有相互密度相連的點(核心點 + 邊界點)組成的最大集合,噪聲點不屬于任何簇。

三、聚類步驟

DBSCAN 的聚類過程可概括為 “遍歷 - 擴展 - 標記” 三個階段,具體步驟如下:

  1. 初始化:將所有點標記為 “未訪問”;初始化簇計數器?C=0。

  2. 遍歷未訪問點
    從數據集中隨機選擇一個未訪問的點?p,標記為 “已訪問”。

  3. 判斷點類型并擴展簇

    • 若?p?是核心點:
      • 新建一個簇?C,將?p?加入簇?C;
      • 收集?p?的 ε 鄰域內所有未訪問的點,放入隊列;
      • 對隊列中的每個點?q:
        • 標記?q?為 “已訪問”;
        • 若?q?是核心點,將其 ε 鄰域內未加入簇的點加入隊列;
        • 將?q?加入簇?C;
      • 簇?C?擴展完成,簇計數器?C+=1。
    • 若?p?是邊界點:
      • 暫時不分配簇,等待被其所屬的核心點的簇包含(邊界點的簇歸屬由第一個發現它的核心點決定)。
    • 若?p?是噪聲點:
      • 標記為噪聲(通常用 - 1 表示),不分配簇。
  4. 重復步驟 2-3:直到所有點都被訪問,聚類結束。

四、參數選擇

DBSCAN 的性能高度依賴于參數 ε 和 MinPts 的選擇,以下是常用的參數調優方法:

1. MinPts 的選擇

MinPts 的取值通常與數據維度相關,經驗規則為:

  • 對于二維數據,MinPts 一般取 4-8;
  • 對于高維數據(維度為?d),MinPts 建議至少為?d+1(確保能形成 “密集區域” 的最小點數)。

2. ε 的選擇

ε 的選擇需結合數據的密度分布,常用方法是k - 距離圖(k-distance graph)

  • 對每個點,計算它到第 k 個最近鄰點的距離(k 通常取 MinPts-1);
  • 將所有點的 k - 距離按升序排序,繪制 k - 距離圖(橫軸為點序號,縱軸為 k - 距離);
  • 圖中 “拐點” 對應的距離即為最佳 ε—— 拐點前距離增長緩慢(密集區域),拐點后距離快速增長(進入稀疏區域)。

例:若 k=3(MinPts=4),k - 距離圖在距離 = 2.5 處出現明顯拐點,則 ε=2.5。

五、優缺點分析

優點

  1. 無需預先指定簇數量:簇的數量由數據密度自動決定,避免了 K-means 中 k 值難調的問題。
  2. 能發現任意形狀的簇:不受簇形狀限制,可識別非球形簇(如環形、條形)。
  3. 抗噪聲能力強:可直接標記噪聲點,適合含異常值的數據。
  4. 對數據庫友好:若使用空間索引(如 R 樹),時間復雜度可降至?O(nlogn)(n 為樣本量)。

缺點

  1. 參數敏感:ε 和 MinPts 的微小變化可能導致聚類結果差異很大,參數調優難度高。
  2. 高維數據效果差:高維空間中距離度量(如歐氏距離)的區分度下降,難以定義 “密度”。
  3. 對密度不均勻數據不友好:若數據中不同簇的密度差異大,難以找到適用于所有簇的 ε 和 MinPts。
  4. 邊界點歸屬模糊:邊界點可能被分配給第一個發現它的核心點的簇,導致簇歸屬不唯一。
  5. 時間復雜度較高:最壞情況下時間復雜度為?O(n2)(無空間索引時),不適合超大規模數據。

六、應用場景

DBSCAN 適用于低密度、形狀不規則且含噪聲的數據,典型應用包括:

  • 空間數據聚類:如城市 POI(興趣點)聚類、GPS 軌跡聚類(識別熱門路線)。
  • 異常檢測:如信用卡欺詐檢測(噪聲點對應異常交易)、設備故障檢測。
  • 圖像處理:如目標分割(從背景中聚類出前景目標)。
  • 文本聚類:結合 TF-IDF 等特征,對主題相近的文本進行聚類(需注意高維問題)。

七、與其他聚類算法對比

算法核心思想優點缺點適用場景
DBSCAN密度聚類任意形狀簇、抗噪聲、無需指定 k參數敏感、高維效果差低密度、非球形簇、含噪聲數據
K-means距離聚類效率高、適合大規模數據需指定 k、僅球形簇、對噪聲敏感低維、球形簇、無噪聲數據
層次聚類層次合并 / 分裂可生成聚類樹、無需指定 k計算復雜度高、對噪聲敏感小規模數據、需層次關系分析

DBSCAN 算法實戰:啤酒數據聚類分析

一、數據背景與目標

本文檔數據包含 20 種啤酒的 4 項特征:熱量(calories)、鈉含量(sodium)、酒精含量(alcohol)和成本(cost),數據格式如下

namecaloriessodiumalcoholcost
Budweiser144154.70.43
Schlitz151194.90.43
...(共 20 條數據)............

目標:使用 DBSCAN 算法基于啤酒的理化特征和成本進行聚類,探索啤酒之間的內在分組規律,并識別可能的 “異常啤酒”(噪聲點)。

二、實戰步驟

1. 數據預處理

(1)數據加載與查看

首先導入必要的庫并加載數據:

import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
from sklearn.cluster import DBSCAN  
from sklearn.preprocessing import StandardScaler  
from sklearn.neighbors import NearestNeighbors  # 加載數據  
data = pd.DataFrame([  ["Budweiser", 144, 15, 4.7, 0.43],  ["Schlitz", 151, 19, 4.9, 0.43],  ["Lowenbrau", 157, 15, 0.9, 0.48],  ["Kronenbourg", 170, 7, 5.2, 0.73],  ["Heineken", 152, 11, 5.0, 0.77],  ["Old_Milwaukee", 145, 23, 4.6, 0.28],  ["Augsberger", 175, 24, 5.5, 0.40],  ["Srohs_Bohemian_Style", 149, 27, 4.7, 0.42],  ["Miller_Lite", 99, 10, 4.3, 0.43],  ["Budweiser_Light", 113, 8, 3.7, 0.40],  ["Coors", 140, 18, 4.6, 0.44],  ["Coors_Light", 102, 15, 4.1, 0.46],  ["Michelob_Light", 135, 11, 4.2, 0.50],  ["Becks", 150, 19, 4.7, 0.76],  ["Kirin", 149, 6, 5.0, 0.79],  ["Pabst_Extra_Light", 68, 15, 2.3, 0.38],  ["Hamms", 139, 19, 4.4, 0.43],  ["Heilemans_Old_Style", 144, 24, 4.9, 0.43],  ["Olympia_Goled_Light", 72, 6, 2.9, 0.46],  ["Schlitz_Light", 97, 7, 4.2, 0.47]  
], columns=["name", "calories", "sodium", "alcohol", "cost"])  # 提取特征數據(排除名稱列)  
X = data[["calories", "sodium", "alcohol", "cost"]]  
(2)數據標準化

DBSCAN 基于距離計算密度,需對特征進行標準化(消除量綱影響):

# 標準化特征(均值為0,方差為1)  
scaler = StandardScaler()  
X_scaled = scaler.fit_transform(X)  

2. 參數選擇(ε 和 MinPts)

(1)確定 MinPts

數據維度為 4(calories、sodium、alcohol、cost),根據經驗規則,MinPts 建議取?d+1=5(d 為維度)。

(2)確定 ε:k - 距離圖法

通過 k - 距離圖找 “拐點”,k 取 MinPts-1=4:

# 計算每個點到第4個最近鄰的距離  
neighbors = NearestNeighbors(n_neighbors=4)  
neighbors_fit = neighbors.fit(X_scaled)  
distances, indices = neighbors_fit.kneighbors(X_scaled)  # 排序距離并繪圖  
distances = np.sort(distances[:, 3], axis=0)  # 取第4個最近鄰的距離  
plt.plot(distances)  
plt.title("k-distance Graph (k=4)")  
plt.xlabel("Point Index")  
plt.ylabel("4th Neighbor Distance")  
plt.grid(True)  
plt.show()  

結果分析:k - 距離圖在距離≈0.6 處出現明顯拐點,因此選擇 ε=0.6。

3. 執行 DBSCAN 聚類

# 初始化DBSCAN模型  
dbscan = DBSCAN(eps=0.6, min_samples=5)  # ε=0.6,MinPts=5  
clusters = dbscan.fit_predict(X_scaled)  # 將聚類結果添加到原數據  
data["cluster"] = clusters  
print("聚類結果:")  
print(data[["name", "cluster"]].sort_values(by="cluster"))  

4. 聚類結果分析

(1)結果概覽

聚類結果如下(-1 表示噪聲點):

namecluster
Budweiser0
Schlitz0
Old_Milwaukee0
Srohs_Bohemian_Style0
Coors0
Hamms0
Heilemans_Old_Style0
Miller_Lite1
Budweiser_Light1
Coors_Light1
Michelob_Light1
Schlitz_Light1
Kronenbourg2
Heineken2
Becks2
Kirin2
Lowenbrau-1
Augsberger-1
Pabst_Extra_Light-1
Olympia_Goled_Light-1
(2)簇解讀
  • 簇 0(常規啤酒):共 7 種啤酒,熱量中等(139-151)、酒精含量 4.4-4.9%、成本較低(0.28-0.44),鈉含量偏高(15-27),適合大眾日常消費。
  • 簇 1(輕量啤酒):共 6 種啤酒,熱量較低(97-135)、酒精含量 3.7-4.3%、成本中等(0.40-0.50),鈉含量適中(7-15),主打低熱量健康概念。
  • 簇 2(進口 / 高端啤酒):共 4 種啤酒(Kronenbourg、Heineken 等),熱量較高(149-170)、酒精含量 5.0-5.2%、成本高(0.73-0.79),鈉含量低(6-19),定位高端市場。
  • 噪聲點(異常啤酒)
    • Lowenbrau:酒精含量僅 0.9%(遠低于其他啤酒),可能是無醇啤酒;
    • Augsberger:熱量最高(175)、鈉含量高(24),但成本中等(0.40),特征獨特;
    • Pabst_Extra_Light 和 Olympia_Goled_Light:熱量極低(68-72)、酒精含量僅 2.3-2.9%,可能是超輕量啤酒或特殊品類。

5. 可視化聚類結果

使用 PCA 降維至 2D 可視化(保留主要特征):

from sklearn.decomposition import PCA  # PCA降維  
pca = PCA(n_components=2)  
X_pca = pca.fit_transform(X_scaled)  # 繪圖  
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=data["cluster"], cmap="viridis", label=data["cluster"])  
for i, name in enumerate(data["name"]):  plt.annotate(name, (X_pca[i, 0], X_pca[i, 1]), fontsize=8)  
plt.title("DBSCAN Clustering Result (PCA 2D)")  
plt.xlabel("PCA Component 1")  
plt.ylabel("PCA Component 2")  
plt.legend(title="Cluster")  
plt.show()  

可視化結論:三個簇在空間中明顯分離,噪聲點遠離密集區域,驗證了聚類結果的合理性。

三、總結

  1. 聚類效果:DBSCAN 成功將啤酒分為 3 個有意義的簇(常規啤酒、輕量啤酒、高端啤酒),并識別出 4 種特征異常的啤酒(噪聲點),符合實際產品分類邏輯。
  2. 參數影響:ε=0.6 和 MinPts=5 的組合效果較好,若 ε 增大,可能將噪聲點劃入簇;若 MinPts 增大,可能導致簇分裂為更多小簇。
  3. 應用價值:該結果可輔助啤酒企業定位產品市場、優化產品線,或為消費者提供基于特征的選購參考。

通過本案例可見,DBSCAN 在小樣本、多特征的消費數據聚類中能有效挖掘潛在分組,且無需預先指定簇數量,是探索性數據分析的有力工具。

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

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

相關文章

【昇騰】基于RK3588 arm架構Ubuntu22.04系統上適配Atlas 200I A2加速模塊安裝EP模式下的驅動固件包_20250808

一、背景 1.1 主要的硬件是&#xff1a;1.2 主要的軟件是&#xff1a; RK3588跑操作系統Atlas 200I A2加速模塊作為EP模式關鍵參數版本說明CPU架構aarch64OS版本Ubuntu 22.04.5 LTSkernel版本5.10.198 二、適配 準備固件run包文件&#xff1a;Ascend-hdk-310b-npu-firmware_7.…

如何在 VS Code 中進行 `cherry-pick`

cherry-pick 是 Git 的一個功能&#xff0c;允許你選擇某個 commit 并將其應用到當前分支&#xff0c;而無需合并整個分支。在 VS Code 中&#xff0c;你可以通過 內置的 Git 功能 或 終端 來完成 cherry-pick。方法 1&#xff1a;使用 VS Code 的 Git 圖形界面&#xff08;GUI…

STM32CubeMX(十三)FatFs文件系統(SPI驅動W25Qxx)

目錄 一、知識點 1. 什么是Fatfs文件系統? 2. Fatfs操作系統控制流程 二、實戰操作 1.CubeMX配置 2. 配置串口以及SPI 3. 修改功能映射接口 4. 添加測試代碼 5. 實驗現象 在完成本章之前需要完成一些基礎配置,詳情查看下面的文章。 STM32CubeMX(二)新建工…

【前端后端部署】將前后端項目部署到云服務器

更多筆記在這里? 全棧之路&#xff1a; https://gitee.com/oldbe/notes 【跳轉到】 覺得有用請點個 star &#xff0c;非常感謝&#xff01; 現在AI太強大&#xff0c;開發個人產品的門檻和成本太低了&#xff0c;只要你有好的想法都可以很快速的開發一款產品 1.…

vue如何監聽localstorage

在Vue中監聽localStorage的變化可以通過幾種方式實現&#xff0c;但需要注意的是&#xff0c;localStorage本身不提供原生的事件監聽機制&#xff0c;如DOM元素的MutationObserver。不過&#xff0c;你可以通過一些間接的方法來監聽localStorage的變化。方法1&#xff1a;使用w…

灰狼算法+四模型對比!GWO-CNN-LSTM-Attention系列四模型多變量時序預測

摘要&#xff1a;聚劃算&#xff01;大對比&#xff01;灰狼算法四模型對比&#xff01;GWO-CNN-LSTM-Attention系列四模型多變量時序預測&#xff0c;該代碼特別適合需要橫向對比不同深度學習模型性能的時序預測場景&#xff0c;研究者可通過參數快速適配不同預測需求&#xf…

冒泡排序實現以及優化

一&#xff0c;冒泡排序說明冒泡排序是從第一個元素開始和后面一個元素進行判斷是否滿足左小右大&#xff0c;如果不滿足就交換位置&#xff0c;再拿第二個和第三個進行上述操作一直到第n-1和第n個。經過上述的一輪操作就可以把第一個最大值放到最右邊&#xff0c;在進行n輪上述…

水下管道巡檢機器人cad【10張】三維圖+設計說明書

摘 要 水下管道是水下油氣管道的生命線&#xff0c;水下管道巡檢機器人可以替代人工完成水下油氣管道狀態的實時監測和數據反饋&#xff0c;有助于工作人員對水下油氣管道的運行情況實時掌握。 本文完成了水下管道巡檢機器人的總體設計&#xff0c;采用三維設計軟件Solidwor…

SQL(結構化查詢語言)的四大核心分類

這張圖展示了 SQL&#xff08;結構化查詢語言&#xff09;的四大核心分類&#xff0c;分別對應不同的數據庫操作場景。以下是逐類解析&#xff1a;1. 數據操作語言&#xff08;DML&#xff1a;Data Manipulation Language&#xff09;作用&#xff1a;用于操作數據庫中的數據&a…

AI(1)-神經網絡(正向傳播與反向傳播)

&#x1f34b;&#x1f34b;AI學習&#x1f34b;&#x1f34b;&#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一下博主…

嵌入式Linux學習 - 數據結構6

五、哈希表1. 哈希算法將數據通過哈希算法映射成一個鍵值&#xff0c;存取都在同一位置實現數據的高效存儲和查找將時間復雜度盡可能降低至O(1)2. 哈希碰撞多個數據通過哈希算法得到的鍵值相同&#xff0c;稱為產生哈希碰撞3. 哈希表構建哈希表存放0-100之間的數據將0 - 100之間…

GitHub 趨勢日報 (2025年08月07日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖1894nautilus_trader354stagehand315openai-cookbook263sim242ollama230prisma154v…

android 使用openimagelib OpenImage 實現點擊放大圖片,瀏覽

在 Android 中使用 OpenImageLib(假設這是一個開源圖片加載庫,類似于 Glide 或 Picasso)實現 點擊放大圖片并瀏覽 的功能,通常需要結合 圖片查看器庫(如 PhotoView)和 圖片加載庫(如 OpenImageLib)。以下是完整的實現方案: 1. 添加依賴 (1) 添加 OpenImageLib 依賴 …

計算機視覺CS231n學習(4)

深度學習軟件 &#xff08;這一部分去看tensorflow和pytorch的筆記&#xff09; &#xff08;見專欄&#xff09;tensorflow和pytorch區別 tensorflow&#xff0c;我們先構建顯示的圖&#xff0c;然后重復運行它 pytorch&#xff0c;我們每次做前向傳播時&#xff0c;都構建一個…

【具身智能】具身智能的革命——人形機器人如何重塑人類日常生活

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! 2025年被譽為具身智能的元年,人形機器人技術迅猛發展,將深刻改變人類生活方式。本文從具身智能的核心概念入手,探討人形機器人的硬件架構、感知系統、運動控制和決策算法等技術基礎。結合…

Jira Service Management企業服務管理:IT、HR、法務、財務等部門如何落地現代企業服務管理理念與實踐

Jira Service Management 服務管理方法Jira Service Management 服務管理方法將開發、IT運營和業務團隊整合至一個統一平臺&#xff0c;以實現更高效的協作。任何團隊都能夠快速響應業務變化&#xff0c;為客戶和員工提供卓越體驗。Jira Service Management 提供直觀、經濟高效…

軟件開發 - danger 與 dangerous、warn 與 warning

danger 與 dangerous 1、danger詞性&#xff1a;n.含義&#xff1a;指可能造成傷害或損失的情況或事物# 例詞in 【danger】&#xff08;處于危險中&#xff09; out of 【danger】&#xff08;脫離危險&#xff09;# 例句After the surgery, the doctor said the patient was o…

為何毫米波需要采用不同的DPD方法?如何量化其值?

摘要 在5G新無線電技術標準中&#xff0c;除了sub-6 GHz頻率外&#xff0c;還利用毫米波(mmWave)頻率來提高吞吐量。毫米波頻率的使用為大幅提高數據吞吐量帶來了獨特的機會&#xff0c;同時也帶來了新的實施挑戰。本文探討sub-6 GHz和毫米波基站無線電之間的架構差異&#xff…

【數據結構入門】棧和隊列的OJ題

目錄 1. 有效的括號 分析&#xff1a; 代碼&#xff1a; 2. 用隊列實現棧 分析&#xff1a; 代碼&#xff1a; 3. 用棧實現隊列 分析&#xff1a; 代碼&#xff1a; 4. 設計循環隊列 思路&#xff1a; 代碼&#xff1a; 定義循環隊列結構體&#xff1a; 初始化結…

#Datawhale AI夏令營#第三期全球AI攻防挑戰賽(AIGC技術-圖像方向)

本次題目來源于Datawhale AI夏令營第三期全球AI攻防挑戰賽圖像生成賽道。首先看一下賽題背景和要求。1.賽題相關大賽背景隨著大模型&#xff08;Deepseek、GPT、LLaMA等&#xff09;的爆發式應用&#xff0c;AI技術已深度融入金融、醫療、智能終端語音交互場等核心領域&#xf…