DBSCAN聚類演算法的原理及sklearn的演示

2021-08-28 18:19:33 字數 2039 閱讀 5266

概念:基於密度的帶有雜訊點的聚類方法。

內部概念理解

1.核心物件:若某個點的密度達到演算法設定的閾值則稱為核心點。

2.距離閾值:設定的半徑r。

3.直接密度可達:若某點p在點q的r鄰域內,且q是核心密度點,則pq直接密度可達。

4.密度可達:直接密度可達的相互傳播。

5.密度相連:若從某核心點q出發,點p和k都能與q核心密度可達,則p和k是密度相連的。

6.邊界點:屬於某個類的非核心點,不能發展下線。

7.雜訊點:不屬於任何乙個類簇的點,從任何乙個點出發都不可能密度可達

工作流程如下:

標記所有物件是unvisited

隨機選擇乙個unvisited的物件p,把他變成visited

如果p某個半徑長度r的鄰域內至少有m個物件。

建立新簇c,然後把p加入到c中;

令n為p的半徑r的鄰域內的所有物件集合。

對n中的每個點s,如果s是unvisted的,把它變為visited,如果s的r鄰域內至少有m個物件,把這些物件新增到n,如果s不是任何簇的成員,將其新增到c,然後輸出c

如果第三步沒有那麼多物件,將其變成雜訊點。

然後不斷迴圈。

程式中需要選擇的引數:

半徑,和半徑中的最少物件m數。

dbscan的優勢:

不需要指定簇個數,可以發現任意形狀的簇,擅長找到離群點

dbscan的缺點:

高維度的資料計算慢(可以做降維,和資料消減),引數難以選擇

python**實現:

分類鳶尾花數。

from sklearn import datasets  

import pandas as pd

import matplotlib.pyplot as plt

import numpy as np

from sklearn.cluster import dbscan

iris=datasets.load_iris(

)iris_x=iris.data[:,

2:4]

#z只取後兩個維度

構造聚類器

estimator = dbscan(eps=

0.5,min_samples=3)

#構造聚類器,乙個引數是半徑,乙個是密度

estimator.fit(iris_x)

label_pred = estimator.labels_ #獲取聚類標籤

#繪製k-means結果

x0 = iris_x[label_pred ==0]

x1 = iris_x[label_pred ==1]

plt.scatter(x0[:,

0], x0[:,

1], c =

"red"

, marker=

'o', label=

'label0'

) plt.scatter(x1[:,

0], x1[:,

1], c =

"green"

, marker=

'*', label=

'label1'

)

plt.show(

)

畫圖:

對於不規則樣本分類dbscan效果更好,但是對於一般有規則便於區分的樣本,有時候可能不如kmeans

DBSCAN聚類演算法原理

概念 鄰域 給定點的 為半徑的區域 核心點 core points 如果點p 的 鄰域內的點數大於mi npts 那麼p 是核心點 直接可達 directly reachable 核心點p到其 鄰域內的所有點是直接可達的。注意必須是 p 必須是核心點 可達 reachable 如果存在一條路徑p1 ...

聚類演算法 DBSCAN

dbscan 是一種簡單的,基於密度的聚類演算法。本次實現中,dbscan 使用了基於中心的方法。在基於中心的方法中,每個資料點的密度通過對以該點為中心以邊長為 2 eps 的網格 鄰域 內的其他資料點的個數來度量。根據資料點的密度分為三類點 1 核心點 該點在鄰域內的密度超過給定的閥值 minps...

DBSCAN聚類演算法

基於密度定義,我們將點分為 dbscan演算法的本質就是隨大流,邊界點緊緊圍繞著核心點,他們抱團,不帶噪點玩兒 小團體多了,聯絡比較密切的小團體之間聚成了同個類 比較偏遠的小團體想要加入這個圈子,進不去,就單幹,我們自己玩自己的,聚成了另外的乙個類 一開始就被孤立的噪點吧,自然有自己的傲骨,接著孤芳...