機器學習第九課之DBSCAN算法

目錄

簡介

一、dbscan相關概念

二、dbscan的API

三、案例分析

1. 導入所需庫

2. 數據讀取與預處理

3. 數據準備

4. DBSCAN 參數調優

5. 確定最佳參數并應用

總結


簡介

????????本次我們將聚焦于一款極具特色的聚類算法 ——DBSCAN。相較于 K-means 等需要預先指定簇數量的算法,DBSCAN 以其 “無監督自適應” 的特性,在聚類領域占據著不可替代的地位。

????????在這一課中,我們會深入剖析 DBSCAN 算法的核心原理。你將了解到它如何通過 “密度可達” 和 “核心對象” 等關鍵概念,自動發現數據集中任意形狀的簇,還能識別出那些不屬于任何簇的噪聲點。這一特性讓它在處理非凸形狀、存在噪聲的數據時,展現出遠超傳統聚類算法的優勢。

一、dbscan相關概念

概念:
????????基于密度的帶噪聲的空間聚類應用算法,它是將簇定義為密度相連的點的最大集合,能夠把具有足夠高密度的區域劃分為簇,并在噪聲的空間數據集中發現任意形狀的聚類。

  1. 核心對象:A 點在 DBSCAN 算法中,如果一個點的 E 鄰域內包含的點的數量大于等于某個給定的閾值(MinPts) ,則這個點被稱為核心對象。圖中的 A 點就是核心對象,以 A 為圓心的紅色圓圈代表其 E 鄰域,可以看到在這個鄰域內有足夠多的其他點(超過了算法設定的閾值)。
  2. E 鄰域:給定對象半徑為 E 內的區域,對于給定的一個對象(點),以該對象為中心,半徑為 E 的區域就是這個對象的 E 鄰域。圖中圍繞每個點的圓圈就代表了相應點的 E 鄰域,例如紅色圓圈是核心對象 A 的 E 鄰域,藍色圓圈是點 N 的 E 鄰域 ,黃色圓圈是點 B 和點 C 的 E 鄰域。
  3. 直接密度可達:如果點 p 在點 q 的 E 鄰域內,并且 q 是核心對象,那么我們稱點 p 從點 q 直接密度可達。在圖中,一些紅色的點位于核心對象 A 的 E 鄰域內,這些點就從 A 點直接密度可達。
  4. 密度可達:如果存在一個點鏈 p1, p2, ..., pn,其中 p1 = q,pn = p,對于 pi ∈ {p1, p2, ..., pn-1},pi+1 從 pi 直接密度可達,那么我們稱點 p 從點 q 密度可達。例如圖中,點 B 和點 C 雖然不在核心對象 A 的 E 鄰域內,但可以通過一系列直接密度可達的點(圖中的紅色點鏈 ),從 A 點密度可達。
  5. 邊界點:B 點、C 點邊界點是指在其 E 鄰域內有點屬于某個簇,但自身不是核心對象的點。圖中的 B 點和 C 點就是邊界點,它們的 E 鄰域(黃色圓圈 )內有來自核心對象 A 所在簇的點,但它們自身的 E 鄰域內點數未達到成為核心對象的閾值。
  6. 離群點:N 點??離群點是指既不是核心對象也不是邊界點的點,也就是不在任何簇中的點。

實現過程:

  1. 輸入數據集
  2. 指定半徑;
  3. 指定密度閾值;

二、dbscan的API

class sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, 
metric='euclidean', metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None)

參數解釋

  • eps:即圖中提到的 “半徑” ,DBSCAN 算法中定義的鄰域半徑。它決定了一個點的鄰域范圍,在這個范圍內去判斷點的密度情況,默認值?0.5
  • min_samples:可以理解為密度閾值相關,即構成核心點所需的鄰域(eps?范圍內)最少樣本數量,用于判斷核心對象,默認?5?。
  • metric:用于計算距離的度量方式,這里是?euclidean(歐幾里得距離),也可選擇其他距離度量,比如曼哈頓距離等,默認用歐氏距離衡量點與點之間的遠近。
  • metric_params:度量函數的額外參數,一般用默認值?None?即可,當?metric?有特殊參數需求時才設置。
  • algorithm:近鄰搜索算法,auto?表示讓算法自動選擇合適的近鄰搜索方法(如?ball_treekd_tree?或?brute?等 ),根據數據情況自適應選擇。
  • leaf_size:構建?BallTree?或?KDTree?時的葉子節點大小,會影響樹構建和查詢的效率,默認?30?。
  • p:當?metric?為閔可夫斯基距離(minkowski)時,p?是閔可夫斯基距離的階數,p=2?就是歐氏距離,p=1?是曼哈頓距離;若?metric?不是閔可夫斯基距離,該參數無意義,默認?None?。
  • n_jobs:用于并行計算的 CPU 核心數,None?表示使用 1 個核心,-1?表示使用所有可用核心,可加速近鄰搜索等過程。

三、案例分析

1. 導入所需庫

import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import adjusted_rand_score, normalized_mutual_info_score
import numpy as np

2. 數據讀取與預處理

# 讀取訓練集和測試集數據
data_train = pd.read_csv("datingTestSet2.txt", sep='\t', encoding='utf-8', engine='python', header=None)
data_test = pd.read_csv("datingTestSet1.txt", sep='\t', encoding='utf-8', engine='python', header=None)# 初始化標準化器
scaler = StandardScaler()# 對特征列進行標準化(所有列除了最后一列,假設最后一列是標簽)
data_train.iloc[:, :-1] = scaler.fit_transform(data_train.iloc[:, :-1])
data_test.iloc[:, :-1] = scaler.transform(data_test.iloc[:, :-1])
  • 標準化處理是 DBSCAN 等基于距離的算法必需的步驟,因為它對特征的尺度敏感
  • 測試集使用訓練集的標準化參數,避免數據泄露

3. 數據準備

x_train = data_train.iloc[:, :-1]  # 訓練集特征
x_test = data_test.iloc[:, :-1]    # 測試集特征
y_train_true = data_train.iloc[:, -1]  # 訓練集真實標簽
y_test_true = data_test.iloc[:, -1]    # 測試集真實標簽

4. DBSCAN 參數調優

# 定義要測試的eps參數范圍
scores = []
eps_param_range = [0.09, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6]for eps in eps_param_range:# 初始化并訓練DBSCAN模型dbscan = DBSCAN(eps=eps, min_samples=2)train_labels = dbscan.fit_predict(x_train)# 計算評估指標,忽略噪聲點(-1)mask = train_labels != -1if np.sum(mask) > 0:  # 確保有非噪聲點ari = adjusted_rand_score(y_train_true[mask], train_labels[mask])nmi = normalized_mutual_info_score(y_train_true[mask], train_labels[mask])score_mean = (ari + nmi) / 2  # 平均得分scores.append(score_mean)print(f"eps等于{eps}的平均得分(ARI+NMI)/2為{score_mean:.4f}")else:print(f"eps等于{eps}時,所有樣本都被標記為噪聲點")scores.append(-1)
  • eps是 DBSCAN 中最重要的參數,定義了鄰域半徑
  • min_samples是構成核心點所需的最小樣本數
  • 使用 ARI(調整蘭德指數)和 NMI(標準化互信息)作為評估指標,這兩個指標都需要真實標簽
  • 忽略噪聲點(標簽為 - 1)對評估的影響

5. 確定最佳參數并應用

# 找到最佳的eps參數
best_eps = eps_param_range[np.argmax(scores)]
print(f"最好的eps是:{best_eps}")# 使用最佳參數重新訓練模型
best_dbscan = DBSCAN(eps=best_eps, min_samples=2)
train_labels = best_dbscan.fit_predict(x_train)
print("訓練集聚類標簽:\n", train_labels)# 對測試集進行預測
test_labels = best_dbscan.fit_predict(x_test)
print("測試集聚類標簽:\n", test_labels)
  • 選擇平均得分最高的eps作為最佳參數
  • 使用最佳參數重新訓練模型并輸出聚類結果
  • 對測試集進行聚類并輸出結果

總結

????????這個案例我做的比較簡單,重點是學習其代碼的邏輯、這個代碼框架可以作為 DBSCAN 算法應用的模板,只需根據實際數據集調整文件路徑和參數范圍即可。

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

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

相關文章

給AI開一副“健忘藥”:Dropout如何治愈神經網絡的死記硬背癥

**——解讀《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》**想象一位學生備考時,只反復背誦三套模擬題答案,卻在真正的考場上面對新題型束手無策——這種**死記硬背不會舉一反三**的問題,正是神經網絡中的“過擬合”…

【框架】跨平臺開發框架自用整理

Tauri 2.0 | Tauri https://github.com/tauri-apps/tauri 創建小型、快速、安全、跨平臺的應用程序 獨立于前端 將你現有的網絡技術棧帶到 Tauri 或開始新的項目。 Tauri 支持任何前端框架,所以你不需要改變你的技術棧。 跨平臺 使用單個代碼庫為 Linux、macOS、W…

web前端第三次作業

一、作業要求&#xff1a;使用js完成抽獎項目 效果和內容自定義&#xff0c;可以模仿游戲抽獎頁面二、代碼<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…

wrap cpp variant as dll for c to use

包裝c的variant給c用 variant_wrapper.cpp #include <variant> #include <unordered_map> #include <cstring> #include <cstdio> #include <new> #include <memory> #include <functional> #include <cstdlib>// 類型ID定義 …

GraphRAG查詢(Query)流程實現原理分析

文章目錄說明一 GraphRAG查詢&#xff08;Query&#xff09;流程二 Local Search 實現原理三 Global Search 實現原理四 GraphRAG Python API使用說明 本文學自賦范社區公開課&#xff0c;僅供學習和交流使用&#xff01;本文重在介紹GraphRAG查詢流程&#xff0c;有關索引構建…

服務器的安全檢測和防御技術

1. 服務器安全風險1.1 不必要的訪問&#xff08;如只提供HTTP服務&#xff09;若服務器僅需提供 HTTP 服務&#xff0c;卻開放了其他不必要的訪問途徑&#xff0c;會增加風險。通過應用識別、控制&#xff0c;可精準識別應用類型&#xff0c;限制非必要訪問&#xff0c;保障服務…

FileLink:為企業跨網文件傳輸筑牢安全與效率基石

FileLink&#xff1a;為企業跨網文件傳輸筑牢安全與效率基石在企業數據往來日益頻繁的今天&#xff0c;跨網文件傳輸的安全性和高效性是企業順暢運營的關鍵。傳統傳輸方式在安全防護、系統融合及成本控制上的短板愈發明顯&#xff0c;而 FileLink 憑借在這些方面的突出表現&…

java設計模式之開閉原則使用舉例

1. 輸入法皮膚擴展&#xff08;抽象類實現&#xff09; 場景&#xff1a;用戶可為輸入法更換不同皮膚&#xff08;如默認皮膚、CSDN皮膚&#xff09;。 實現&#xff1a; 抽象層&#xff1a;定義抽象類AbstractSkin&#xff0c;聲明皮膚顯示方法。擴展&#xff1a;新增皮膚只需…

Spark Shuffle機制原理

文章目錄1.什么是Shuffle?2.Shuffle解決什么問題?3.Shuffle Write與Shuffle Read4.Shuffle的計算需求4.1 計算需求表4.2 partitionby4.3 groupByKey4.4 reduceByKey4.5 sortByKey5.Shuffle Write框架設計與實現5.1 Shuffle Write框架實現的功能5.2 Shuffle Write的多種情況5.…

Cursor vs Trae vs VSCode:2025終極IDE橫評,誰才是開發者的效率之選?

前言 2025年的編程世界&#xff0c;AI不再只是輔助&#xff0c;而是編程工作流的核心驅動者。從微軟的VSCode 到新銳 Cursor 與國產黑馬 Trae &#xff0c;三大 IDE 正在重新定義“人機協作”的邊界。本文從架構設計、AI能力、場景適配等維度&#xff0c;帶你看透工具本質&…

Vue 安裝指定版本依賴包、刪除某個依賴包、依賴管理

如何安裝指定版本的依賴包安裝指定版本&#xff1a;一旦你知道了想要的版本號&#xff0c;比如3.4.0&#xff0c;你可以使用以下命令來安裝這個版本的vue-router&#xff1a;npm install vue-router3.4.0 --save這里的^表示安裝3.4.0的最新小版本更新&#xff0c;但不會超過主版…

psycopg2 如何驗證鏈接是否有效

在 psycopg2 中&#xff0c;驗證數據庫連接是否有效&#xff08;即連接是否仍然活躍&#xff09;可以通過以下幾種方法實現&#xff1a;1. 使用 conn.closed 屬性 psycopg2 的連接對象有一個 closed 屬性&#xff0c;可以檢查連接是否已關閉&#xff1a; import psycopg2conn …

數據科學與計算-電商雙11美妝數據分析

一、項目背景&#xff1a;雙 11 美妝數據的價值所在 每年的 “雙 11” 購物節都是電商行業的盛宴&#xff0c;而美妝品類作為消費熱門領域&#xff0c;蘊含著豐富的用戶行為與市場趨勢信息。該項目聚焦雙 11 期間的美妝電商數據&#xff0c;旨在通過數據分析揭示以下核心問題&…

簡單了解MongoDB數據存儲

官方文檔&#xff1a;MongoDB中文手冊|官方文檔中文版 | MongoDB-CN-Manual 什么是MongoDB? MongnDB是一個分布式文件存儲數據庫(或叫文檔數據庫)&#xff0c;是一個介于 關系數據庫和非關系數據庫之間的產品&#xff0c;是非關系數據庫當中功能最豐富&#xff0c;最像關系數…

web網站開發,在線%射擊比賽成績管理%系統開發demo,基于html,css,jquery,python,django,model,orm,mysql數據庫

經驗心得 這個也是crud業務單子&#xff0c;第二個聊點其他的&#xff0c;從最早的無分層開發&#xff0c;到三層開發&#xff0c;工廠&#xff0c;各種接口&#xff0c;再到后面多層&#xff0c;代碼無痕aop&#xff0c;各種框架等&#xff0c;都是在方便我們快速打架一個程序…

[QtADS]解析ads.pro

本文來源 &#xff1a; 騰訊元寶subdirs : 子目錄TEMPLATE subdirs的作用????核心功能??&#xff1a;聲明當前項目為“多項目管理”模式。Qt 的構建系統&#xff08;qmake&#xff09;會遍歷 SUBDIRS中列出的子目錄&#xff0c;在每個子目錄中尋找 .pro文件并遞歸構建。…

三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,手電筒置灰,無法打開,提提示相機正在使用

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,點擊手電筒,手電筒置灰,無法打開,提提示相機正在使用9348353 目錄 一、問題背景 二、:問題分析過程 2.1:基于…

Java Selenium 自動打開瀏覽器保存截圖

// 代碼 public class ScreenshotExample {public static void main(String[] args) {// 1. 設置瀏覽器驅動路徑&#xff08;根據實際路徑修改&#xff09;System.setProperty("webdriver.chrome.driver", "D:\\chromedriver-win64\\chromedriver.exe");//…

新商機:為了減少輻射,可以用座機打機房中心再轉手機

某些人痛恨自家附近有基站&#xff0c;說是輻射太大。你不能說人家迷信。一般解決辦法就是拆基站。而我覺得&#xff0c;商機來了。現在座機基本沒人裝了。新商機就是座機。附近沒有基站&#xff0c;又要打電話&#xff0c;怎么辦&#xff1f;裝座機。用座機打電話時&#xff0…

【Java|第十九篇】面向對象九——String類和枚舉類

&#xff08;四&#xff09;面向對象11、String類&#xff08;1&#xff09;概述<1>String是一個類&#xff0c;引用數據類型&#xff0c;用來表示字符串&#xff1b;<2>String是Lang包下的類&#xff0c;使用不需要導包&#xff1b;<3>字符串的值不能變&…