日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习 聚类篇——DBSCAN的参数选择及其应用于离群值检测

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习 聚类篇——DBSCAN的参数选择及其应用于离群值检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

機器學習 聚類篇——DBSCAN的算法原理、參數選擇及其應用于離群值檢測

  • 摘要
  • 1. DBSCAN算法原理
    • 1.1 基本概念定義
    • 1.2 算法流程
  • 2. 參數選擇
    • 2.1 領域半徑:Eps的選取方法(**k-distance函數**)
    • 2.2 MinPts的選取方法
  • 3. Python實現
  • 4. 檢測離群值的實例
    • 4.1 導包及設置隨機種子
    • 4.2 生成moon數據并繪圖
    • 4.3 選擇參數
    • 4.4 建立聚類模型
    • 4.5 可視化展示

摘要

DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 為一種基于密度的聚類算法,本文主要介紹了DBSCAN算法的原理和參數選擇方法,并實現了一個離群值檢測案例,供讀者參考。

1. DBSCAN算法原理

1.1 基本概念定義

DBSCAN算法主要有兩個參數:
領域半徑:Eps
成為核心對象的在領域半徑內的最少點數:MinPts
以上兩個參數都會在下面的概念介紹中提到。

  • Eps領域(Eps-neighborhood of a point)
    點p的Eps鄰域,記為NEps(p),定義為NEps(p)= {q∈D | dist(p,q)≤Eps}。

  • 核心對象 (core points)
    如果給定對象Eps領域內的樣本點數大于等于MinPts,則稱該對象為核心對象。

  • 直接密度可達(directly density-reachable)
    若:
    1) p∈ NEps(q)
    2)|NEps(q)| ≥ MinPts
    則稱對象p從核心對象q是直接密度可達的。

  • 密度可達(density-reachable)
    對于對象p1,p2, …, pn
    令p1= q, pn = p。
    若pi+1是從pi直接密度可達的,則稱p是從q密度可達的。

  • 密度相連(density-connected)
    對于點p和點q,若點p點q都是從點o密度可達的,則稱點p和點q密度相連。

  • (cluster)
    對于數據集D,若C是其中一個簇,C中的點需要滿足以下兩個條件:
    1)? p, q,如果 p∈ C且q 是從p密度可達的,則 q∈ C。
    2)? p, q ∈ C,p和q是密度相連的。

  • 噪音(noise)
    不屬于任何簇的點為噪音數據。

1.2 算法流程

  • 1)給定領域半徑:Eps和成為核心對象的在領域半徑內的最少點數:MinPts
  • 2)從任意點p開始,將其標記為”visited“,檢查其是否為核心點(即p的Eps鄰域至少有MinPts個對象),如果不是核心點,則將其標記為噪聲點。否則為p創建一個新的簇C,并且把把p的Eps鄰域中的所有對象都放到候選集合N中。
  • -3)迭代地把N中不屬于其它簇的對象添加至C中,在此過程中,對于N中標記為”unvisited"的對象p‘,把它標記為“visited”,并且檢查它的Eps鄰域,如果p’也為核心對象,則p’的Eps鄰域中的對象都被添加至N中。繼續添加對象至C中,直到C不能擴展,即直到N為空。此時,簇C完全生成。
  • 4)從剩余的對象中隨機選擇下一個未訪問對象,重復3)的過程,直到所有對象都被訪問。

2. 參數選擇

2.1 領域半徑:Eps的選取方法(k-distance函數

  • 1)選取k值,建議取k為2*維度-1。(其中維度為特征數)
  • 2) 計算并繪制k-distance圖。(計算出每個點到距其第k近的點的距離,然后將這些距離從大到小排序后進行繪圖。)
  • 3)找到拐點位置的距離,即為Eps的值。
    如下圖所示:

2.2 MinPts的選取方法

  • MinPts的取值為上述k值加1,即

MinPts=k+1MinPts = k+1 MinPts=k+1

3. Python實現

鏈接: 參考我的另一篇博客.

4. 檢測離群值的實例

4.1 導包及設置隨機種子

import numpy as np from sklearn.datasets import make_moons import matplotlib.pyplot as plt from sklearn.cluster import DBSCANnp.random.seed(2021)

4.2 生成moon數據并繪圖

data = np.ones([1005,2]) data[:1000] = make_moons(n_samples=1000,noise=0.05,random_state=2022)[0] data[1000:] = [[-1,-0.5],[-0.5,-1],[-1,1.5],[2.5,-0.5],[2,1.5]] print(data.shape) plt.scatter(data[:,0],data[:,1],color="c") plt.show()

4.3 選擇參數

def select_MinPts(data,k):k_dist = []for i in range(data.shape[0]):dist = (((data[i] - data)**2).sum(axis=1)**0.5)dist.sort()k_dist.append(dist[k])return np.array(k_dist) k = 3 # 此處k取 2*2 -1 k_dist = select_MinPts(data,k) k_dist.sort() plt.plot(np.arange(k_dist.shape[0]),k_dist[::-1])


有明顯拐點

# 由拐點確定鄰域半徑 eps = k_dist[::-1][15] plt.scatter(15,eps,color="r") plt.plot([0,15],[eps,eps],linestyle="--",color = "r") plt.plot([15,15],[0,eps],linestyle="--",color = "r") plt.show()

4.4 建立聚類模型

dbscan_model = DBSCAN(eps=eps,min_samples=k+1) label = dbscan_model.fit_predict(data) print(label) [ 0 0 0 ... -1 -1 -1]

4.5 可視化展示

class_1 = [] class_2 = [] noise = [] for index,value in enumerate(label):if value == 0:class_1.append(index)elif value == 1:class_2.append(index)elif value == -1:noise.append(index) plt.scatter(data[class_1,0],data[class_1,1],color="g",label="class 1") plt.scatter(data[class_2,0],data[class_2,1],color="b",label = "class 2") plt.scatter(data[noise,0],data[noise,1],color="r",label = "noise") plt.legend() plt.show()

by CyrusMay 2021 02 03

你和我背著空空的書包
逃出名為日常的監牢
忘了要長大
忘了要變老
忘了時間有腳
——————五月天(好好)——————

總結

以上是生活随笔為你收集整理的机器学习 聚类篇——DBSCAN的参数选择及其应用于离群值检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。