概念:基於密度的帶有雜訊點的聚類方法。
內部概念理解:
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演算法的本質就是隨大流,邊界點緊緊圍繞著核心點,他們抱團,不帶噪點玩兒 小團體多了,聯絡比較密切的小團體之間聚成了同個類 比較偏遠的小團體想要加入這個圈子,進不去,就單幹,我們自己玩自己的,聚成了另外的乙個類 一開始就被孤立的噪點吧,自然有自己的傲骨,接著孤芳...