文章目錄
- DBSCAN算法
- 基本概念
- 1個核心思想:基于密度
- 2個算法參數:鄰域半徑R和最少點數目minpoints
- 3種點的類別:核心點,邊界點和噪聲點
- 4種點的關系:密度直達,密度可達,密度相連,非密度相連
- DBSCAN算法步驟
- DBSCAN代碼
- 參考文獻
DBSCAN算法
DBSCAN算法是一個基于密度、對噪聲魯棒的空間聚類算法:DB-SCAN可以找到樣本點的全部密集區域,把這些密集區域當做一個一個的聚類簇
DB-SCAN算法的特點:
- 基于密度,對遠離密度核心的噪聲點魯棒
- 無需知道聚類簇的數量
- 可以發現任意形狀的聚類簇
基本概念
1個核心思想:基于密度
DBSCAN算法可以找到樣本點的全部密集區域,并把這些密集區域當做一個一個的聚類簇
2個算法參數:鄰域半徑R和最少點數目minpoints
這兩個算法參數在刻畫什么叫密集:當鄰域半徑R內的點的個數大于最少點數目minpoints時,就是密集
3種點的類別:核心點,邊界點和噪聲點
- 核心點:如果一個點P在半徑\varepsilon內擁有超過minpoints個的點(包括點P自身),則點P被認為是一個核心點
- 邊界點:如果一個點不是核心點,但在某個核心點的\varepsilon范圍內,并且至少是minpoints-1個核心點的密度直達點,則這個點被認為是邊界點
- 噪聲點:如果一個點既不是核心點,也不是任何核心點的密度可達點,則被認為是噪聲點
4種點的關系:密度直達,密度可達,密度相連,非密度相連
- 密度直達:如果P為核心點,Q在P的R鄰域內,那么稱P到Q密度直達。任何核心點到其自身密度直達,密度直達不具有對稱性,如果P到Q密度直達,那么Q到P不一定密度直達(Q不一定是核心點,在Q的\varepsilon鄰域內沒有足夠的點,不能將P包含在其密度直達性簇內)
- 密度可達:如果存在核心點P2,P3,……,Pn,且P1到P2密度直達,P2到P3密度直達,……,P(n-1)到Pn密度直達,Pn到Q密度直達,則P1到Q密度可達,密度可達也不具有對稱性
- 密度相連:如果存在核心點S,使得S到P和Q都密度可達,則P和Q密度相連。密度相連具有對稱性,如果P和Q密度相連,那么Q和P也一定密度相連,密度相連的兩個點屬于同一個聚類簇
- 非密度相連:如果兩個點不屬于密度相連關系,則兩個點非密度相連。非密度相連的兩個點屬于不同的聚類簇,或者其中存在噪聲點
DBSCAN算法步驟
聚類簇(Cluster):由一個核心點P和所有從P密度可達的點組成
- 尋找核心點形成臨時聚類簇
掃描全部樣本點,如果某個樣本點R半徑范圍內點數目>=minpoints,則將其納入核心點列表,并將其密度直達的點形成對應的臨時聚類簇 - 合并臨時聚類簇得到聚類簇
重復此操作,直到當前臨時聚類簇中的每一個點要么不在核心點列表,要么其密度直達的點都已經在該臨時聚類簇,該臨時聚類簇升級成為聚類簇
DBSCAN代碼
# --*-- coding:utf-8 --*--
# @Author : 一只楚楚貓
# @File : 05DBSCAN.py
# @Software : PyCharmimport numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.cluster import dbscan
import matplotlib.pyplot as pltX, _ = datasets.make_moons(n_samples=500, noise=0.1, random_state=1)
df = pd.DataFrame(X, columns=['feature1', 'feature2'])df.plot.scatter('feature1', 'feature2', s=100, alpha=0.6, title='dataset by make_moon')
plt.show()"""
eps為鄰域半徑,min_samples為最少點數目
cluster_ids中-1表示對應的點為噪聲點
"""
core_samples, cluster_ids = dbscan(X, eps=0.2, min_samples=20)"""
np.c_ 是 NumPy 庫中的一個函數,用于沿著列(列優先)堆疊數組# 假設有兩個一維數組 a 和 ba = np.array([1, 2, 3])b = np.array([4, 5, 6])c = np.c_[a, b][[1 4][2 5][3 6]]
"""
df = pd.DataFrame(np.c_[X, cluster_ids], columns=['feature1', 'feature2', 'cluster_id'])"""
astype('i2') 是一個用于轉換數據類型的方法,將 'cluster_id' 列的數據類型轉換為 16 位整數(int16 或 i2)
"""
df['cluster_id'] = df['cluster_id'].astype('i2')"""
c = list(df['cluster_id']): c 參數指定了每個點的顏色,這里使用 list() 函數將 DataFrame 中 'cluster_id' 列的值轉換成列表,列表中的每個元素對應一個點的顏色
cmap = 'rainbow': cmap 參數設置顏色映射表,用于根據 'cluster_id' 列的值為散點圖上的點分配顏色。'rainbow' 是一個預設的顏色映射,它將按照彩虹的顏色順序為不同的聚類分配顏色
colorbar = False: 這個參數決定是否在散點圖旁邊顯示顏色條,顏色條用于顯示顏色和 'cluster_id' 值之間的映射關系
"""
df.plot.scatter('feature1', 'feature2', s=100, c=list(df['cluster_id']), cmap='rainbow', colorbar=False, alpha=0.6,title='DBSCAN cluster result')
plt.show()
參考文獻
1、圖解機器學習 | 聚類算法詳解:https://www.showmeai.tech/article-detail/197
2、20分鐘學會DBSCAN聚類算法:https://cloud.tencent.com/developer/article/1664886
3、ChatGPT